2014-02-13 32 views
0

工作我看了一些关于JavaScript中的书,它是使用OOP构建Web应用程序一个非常强大的语言,但现在我有,我不知道这是否是一个问题可以解决:与Object.defineProperty和“GET”功能

var myObj = {}; 
myObj.properties = {}; 
myObj.properties.myProperty = 'foo'; 

让我解释一下,现在我有myObj ..设置好的内properties对象......现在,如果我问 为myObj.properties.myProperty我会得到foo。但是如果我要求myObj.properties.notSettedValue? (即undefined

我在MDN上看到了关于Object.defineProperty的文章,可以在属性上设置setter和getter。

我试图设置myObj.properties

Object.defineProperty(myObj, 'properties', { 
    get : function(){ 
     console.log("called custom get property.", this, arguments); 
    } 
}); 

"get"价值......但无关,宣称只为自己myObj.properties工作get功能。自定义功能仅在我请求myObj.properties时才会调用。不是为了孩子。

有一种解决方案将请求的myObj.properties.notSettedValue传递给函数myObj.properties

(不使用的功能或类似myObj.properties.getItem('notSettedValue')的方法)

回答

0

基本上你要问的是是否有可能建立一个被调用函数,如果代码试图从没有按”对象检索属性在那个对象上存在。

不,JavaScript没有这种能力。 ES6的proxies会使事情变得非常相似,但从ES5开始,没有“全部捕获”功能。

你唯一的ES5兼容机制就像你说的那样,使用函数而不是属性(您的getItem)。

+0

我怀疑这....虽然有一些JavaScript的“神奇”功能,并非所有的可能现在..十多年来从ES3传递到ES5 ......多少次,我们将等待ES6 ? ... – Salcos

+0

@Salcos:不久,我很高兴地说。有关人员一起行动起来。你可以看一下(http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts)最新的[为ES6这里规范草案。我认为它不会在2014年完成,但我怀疑它会在2015年,所以这是自5.0和5.1以来的四年后的大约六年。但是与ES5相比,ES6有了很大的变化。 –

0

对象在JavaScript是动态的。您可以即时添加新的属性,就像您在示例中所做的那样,例如myObj.properties = {}

在引擎盖下发生的是解释器将尝试在myObj实例上找到名为properties的属性;如果没有这样的属性,那么它将浏览原型链。在这个例子中,它将访问Object构造函数的原型,因为myObj是对象字面值。如果它无法在原型链中找到该属性,那么它将创建它并将其添加为对象的新成员。

同样的,当你想读一个属性适用。但是在这种情况下,如果找不到请求的属性,它将返回undefined;所以除非你明确地定义了属性,否则它总会返回undefined。这适用于您访问简单属性和ES5属性的情况。

+0

这不回答这个问题。它只是描述了属性如何工作,OP似乎已经(大部分)已经理解了。 –

+0

好吧,在我看来,他不明白 – ppoliani

+0

这个问题有点凑合,但它很清楚:有没有办法在代码访问不存在的属性时调用某个函数? –