【问题标题】:Work with Object.defineProperty and its 'get' function使用 Object.defineProperty 及其“获取”功能
【发布时间】:2014-03-12 04:45:11
【问题描述】:

看了几本关于 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。

我尝试在myObj.properties 上设置"get"

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

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

有一个解决方案可以将请求的myObj.properties.notSettedValue 传递给myObj.propertiesget 函数吗?

(不使用像myObj.properties.getItem('notSettedValue')这样的函数或方法)

【问题讨论】:

    标签: javascript oop object properties


    【解决方案1】:

    基本上,您要问的是是否可以设置一个函数,如果代码尝试从该对象上不存在的对象检索属性,则该函数会被调用。

    不,JavaScript 没有这种能力。 ES6 的proxies 将使类似的事情成为可能,但在 ES5 中,没有“包罗万象”的 getter 功能。

    正如你所说,你唯一的 ES5 兼容机制来实现这种包罗万象,使用函数而不是属性(你的 getItem)。

    【讨论】:

    • 我怀疑它....虽然 JavaScript 中有一些“神奇”功能,但现在并非一切都是可能的.. 从 ES3 到 ES5 已经过去了十多年...多少次我们会等待 ES6 吗? ...
    • @Salcos:没那么久,我很高兴地说。有关人员齐心协力。你可以看看最新的draft specifications for ES6 here。我认为它不会在 2014 年完成,但我怀疑它会在 2015 年完成,所以距离 5.0 大约六年,距离 5.1 大约四年。但与 ES5 相比,ES6 变化很大
    【解决方案2】:

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

    幕后发生的事情是解释器将尝试在myObj 实例上找到一个名为properties 的属性;如果没有这样的属性,那么它将在原型链中导航。在这个例子中,它将访问 Object 构造函数的原型,因为myObj 是一个对象字面量。如果它在原型链中找不到该属性,那么它将创建它并将其添加为对象的新成员。

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

    【讨论】:

    • 这不能回答问题。它只是描述了属性是如何工作的,OP 似乎已经(大部分)理解了。
    • 嗯,在我看来他不明白
    • 这个问题有点啰嗦,但很清楚:有没有办法在代码访问不存在的属性时调用函数?
    • 是的,我回答说不。使用当前版本的 EcmaScript 是不可能的。
    猜你喜欢
    • 2012-02-15
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多