Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Object.defineProperty及其“get”函数_Javascript_Oop_Object_Properties - Fatal编程技术网

Javascript 使用Object.defineProperty及其“get”函数

Javascript 使用Object.defineProperty及其“get”函数,javascript,oop,object,properties,Javascript,Oop,Object,Properties,我读了几本关于JavaScript的书,它是一种非常强大的语言,用于使用OOP构建web应用程序,但现在我遇到了一个问题,我不知道它是否可以解决: var myObj = {}; myObj.properties = {}; myObj.properties.myProperty = 'foo'; 让我解释一下,现在我有了myObj。。已在内部设置属性对象。。。现在,如果我问 对于myObj.properties.myProperty,我将获得foo。但是如果我要myObj.propertie

我读了几本关于JavaScript的书,它是一种非常强大的语言,用于使用OOP构建web应用程序,但现在我遇到了一个问题,我不知道它是否可以解决:

var myObj = {};
myObj.properties = {};
myObj.properties.myProperty = 'foo';
让我解释一下,现在我有了myObj。。已在内部设置属性对象。。。现在,如果我问 对于myObj.properties.myProperty,我将获得foo。但是如果我要myObj.properties.notSettedValue呢?这是未定义的

我读过MDN上的Object.defineProperty,它可以在属性上设置setter和getter

我试图在myObj.properties上设置get值

。。。但是没什么可做的,为myObj.properties声明的get函数只为自己工作。仅当我请求myObj.properties时才会调用自定义函数。不适合它的孩子

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


如果不使用myObj.properties.getItem'notSettedValue'

这样的函数或方法,基本上您要问的是,如果代码试图从对象上不存在的对象检索属性,是否可以设置一个函数来调用该函数

不,JavaScript没有这种能力。ES6将使类似的事情成为可能,但在ES5中,没有全面的getter特性


正如您所说,实现这种“一网打尽”的唯一ES5兼容机制是使用函数而不是属性来获取getItem。

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

在这种情况下,解释器将尝试在myObj实例上查找名为properties的属性;如果没有这样的属性,那么它将在原型链中导航。在本例中,它将访问对象构造函数的原型,因为myObj是一个对象文本。如果在原型链中找不到该属性,则将创建该属性并将其添加为对象的新成员


当您想要读取属性时,同样适用。但是在这种情况下,如果找不到请求的属性,它将返回undefined;因此,除非您显式定义属性,否则它将始终返回undefined。这适用于访问简单属性和ES5属性的情况。

这并不能回答问题。它只是描述了财产是如何运作的,OP似乎已经基本了解了。在我看来,他似乎不明白这个问题有点漫无边际,但很清楚:当代码访问一个不存在的属性时,有没有办法调用一个函数?是的,我回答说没有。用当前版本的EcmaScript是不可能的。我怀疑。。。。虽然JavaScript中有一些神奇的功能,但现在并非所有功能都可以实现。。从ES3到ES5已经过去了十多年。。。我们将等待多少次ES6@萨尔科斯:我很高兴地说,不会太久。相关人员齐心协力。你可以看看最新的。我不认为它会在2014年定稿,但我怀疑它会在2015年定稿,所以从5.0到现在已经六年了,从5.1到现在已经四年了。但与ES5相比,ES6有很大的变化。
Object.defineProperty(myObj, 'properties', { 
    get : function(){ 
        console.log("called custom get property.", this, arguments); 
    } 
});