我想知道在JavaScript中这是否可行,我希望有一个可以包含动态属性的Object。
举个例子:
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?
感谢。
答案 0 :(得分:4)
这与实现目标的距离非常接近。
代码:
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"
答案 1 :(得分:3)
'代理'可以那样做
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 :(得分:2)
是的,但仅限于2.0及更高版本。确切的语法仍然是TBD,但它看起来至少对于对象文字是get * () {...}
。
答案 3 :(得分:1)
不。 JavaScript不是Smalltalk。
答案 4 :(得分:1)
无法拦截JavaScript中的直接属性访问。检索到尚未设置的属性时,结果将为undefined
。虽然null
和undefined
通常被认为是同一件事,但实际上它们是不同的实体。
在JavaScript中undefined
表示没有值,null
表示值为null。在某些情况下,您可以混合undefined和null。例如,使用==
运算符时,它们是等效的((null == undefined) === true
)。使用非强制运算符===
,它们是不同的((null === undefined) === false
)。
您可以利用此优势。虽然大多数人会声称您应该使用非强制平等运算符(===
),但将null
和undefined
置于同一个存储桶中是绝对安全的,当然您实际上并不在乎关于两者之间的区别。令它变得棘手的是undefined
是全局对象的属性,因此可以赋予新值。
如果有人说undefined = 'donkey'
,则null == undefined
会开始返回false
。在实践中,这几乎不是一个问题,因为大多数人都不愚蠢地重新分配未定义的值。
因此,以迂回的方式,只要您使用{将结果与null
进行比较,就不需要对属性访问进行陷阱,以便为尚未设置的属性返回null
{1}}。
答案 5 :(得分:0)
否,除非您正在操作由NPAPI插件控制的对象,在这种情况下您可以实现预期的行为。
换句话说,通过NPAPI插件,您可以实现您正在寻找的行为。
答案 6 :(得分:0)
查看javascript原型。我认为这至少可以为你提供一些你想要的东西。只需谷歌“javascript原型”。
答案 7 :(得分:0)
在您的示例中,第二个警报不会生成错误。它只会提醒undefined
。访问属性的属性将生成错误:
myobj.property2.property3