[英]Dynamic Property of JavaScript object?
我想知道這在 JavaScript 中是否可行,我想要一個可以包含動態屬性的對象。
舉個例子:
function MyObject()
{
}
var myobj = new MyObject();
myobj.property1 = "something";
alert(myobj.property1); // something
alert(myobj.property2); // this should never report error, instead the property should be evaluated to null, as it has never been set.
有什么方法可以攔截 JavaScript 中的屬性調用,以便我可以主動將無值屬性設置為 null?
謝謝。
這大約是您可以實現目標的程度。
代碼:
var obj = {};
alert("prop: " + obj.prop);
obj.prop = "something";
alert("prop: " + obj.prop);
delete obj.prop;
alert("prop: " + obj.prop);
行為:
Alert: "prop: undefined" Alert: "prop: something" Alert: "prop: undefined"
“代理”可以做到這一點
var myobj = new Object();
var handler = {
get:function (obj, name, proxyed){
if(obj[name] !== undefined) // if obj[name] exist
return obj[name]; // then return obj[name]
return null; // if obj[name] is not exist then return null;
}
};
var obj = new Proxy(myobj, handler);
obj.property1 = "something";
alert(myobj.property1); // something
alert(myobj.property2); // undefined
alert(obj.property1); // something
alert(obj.property2); // null
是的,但僅限於 2.0 及更高版本。 確切的語法仍然是待定的,但它看起來至少是對象文字的get * () {...}
。
不。 JavaScript 不是 Smalltalk。
無法攔截 JavaScript 中的直接屬性訪問。 當檢索到尚未設置的屬性時,結果將是undefined
。 盡管null
和undefined
通常被認為是同一個東西,但它們實際上是不同的實體。
在 JavaScript 中undefined
意味着沒有值, null
意味着值為 null。 在某些情況下,您可以混合使用 undefined 和 null。 例如,當使用==
運算符時,它們是等效的( (null == undefined) === true
)。 使用非強制運算符===
,它們是不同的( (null === undefined) === false
)。
您可以充分利用這一點。 雖然大多數人會聲稱您應該使用非強制相等運算符 ( ===
),但將null
和undefined
放在同一個存儲桶中通常是安全的,當然,您實際上不太關心兩者之間的區別。 棘手的地方在於undefined
是全局對象的一個屬性,因此可以為其分配一個新值。
如果有人說undefined = 'donkey'
那么null == undefined
將開始返回false
。 在實踐中,這幾乎從來都不是問題,因為大多數人不會愚蠢到重新分配 undefined 的值。
因此,以一種迂回的方式,只要您使用==
將結果與null
進行比較,您就不需要捕獲屬性訪問來為尚未設置的屬性返回null
。
否,除非您正在操作由 NPAPI 插件控制的對象,在這種情況下您可以實現預期的行為。
換句話說,通過 NPAPI 插件,您可以實現您正在尋找的行為。
查看 javascript 原型。 我認為這至少會給你一些你正在尋找的東西。 只需谷歌搜索“javascript 原型”。
在您的示例中,第二個警報不會產生錯誤。 它只會提醒undefined
。 訪問屬性的屬性會產生錯誤:
myobj.property2.property3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.