我读了一些关于JavaScript的书,它是一个非常强大的语言,用于使用OOP构建Web应用程序,但现在我遇到了一个问题,我不知道它是否可以解决:
var myObj = {};
myObj.properties = {};
myObj.properties.myProperty = 'foo';
让我解释一下,现在我有myObj
..设置properties
对象里面...现在,如果我问
对于myObj.properties.myProperty
,我会得到foo
。但是,如果我要求myObj.properties.notSettedValue
怎么办? (即undefined
)
我在MDN上阅读了Object.defineProperty
,可以在属性上设置setter和getter。
我尝试在"get"
myObj.properties
值
Object.defineProperty(myObj, 'properties', {
get : function(){
console.log("called custom get property.", this, arguments);
}
});
...但无事可做,为get
声明的myObj.properties
函数仅适用于自身。只有在我请求myObj.properties
时才会调用自定义函数。不是为了孩子。
有一个解决方案可以将请求的myObj.properties.notSettedValue
传递给get
的{{1}}函数吗?
(不使用像myObj.properties
这样的函数或方法)
答案 0 :(得分:0)
基本上你要问的是,如果代码试图从该对象上不存在的对象中检索属性,是否可以设置一个被调用的函数。
不,JavaScript没有这种能力。 ES6的proxies会使某些东西变得非常相似,但从ES5开始,没有“全部捕获”的getter功能。
你所做的唯一与ES5兼容的机制正如你所说,使用函数而不是属性(你的getItem
)。
答案 1 :(得分:0)
JavaScript中的对象是动态的。您可以动态添加新属性,就像您在示例中所做的那样,例如myObj.properties = {}
在幕后发生的事情是,解释器将尝试在properties
实例上找到名为myObj
的属性;如果没有这样的属性,那么它将在原型链中导航。在这个例子中,它将访问Object构造函数的原型,因为myObj
是一个对象文字。如果它在原型链中找不到该属性,那么它将创建它并将其添加为对象的新成员。
当您想要阅读某个属性时同样适用。但在这种情况下,如果找不到请求的属性,它将返回undefined;因此,除非您明确定义属性,否则它将始终返回undefined。这适用于访问简单属性和ES5属性时。