来自getter方法的意外引用

时间:2015-07-19 20:11:01

标签: javascript pass-by-reference getter defineproperty

这是一个对象 包含字符串列表(valuesDictionnary), 这些字符串可以从外部读取 将getter列表设置为a的对象 对象的属性(gettersDictionnary)。

这个奇怪的结构用于制作字符串 列表从外部无法配置,但可配置,因此可以从中删除 内部。

var obj = new (function () {

    var gettersDictionnary = {},
        valuesDictionnary = {
            anyValue: "problem"
        };

    Object.defineProperty(this, "gettersDictionnary", {
        configurable: false,
        get: function () {
            return gettersDictionnary;
        }
    });

    Object.defineProperty(gettersDictionnary, "anyValue", {
        configurable: true,
        get: function () {
            return valuesDictionnary["anyValue"];
        }
    });

})();

这就是重点, 当"删除"指令被发送到其中一个getter(" anyValue") 从对象的外部,它应该以破坏结束 由" return"给出的列表中包含的字符串运营商,不是 破坏变量gettersDictionnary中包含的字符串。 但确实如此。

然后我问为什么在这种情况下"返回"运营商似乎给 对变量gettersDictionnary的引用,但不是它的值 应该这样做。

console.log(obj.gettersDictionnary.anyValue); //"problem"

delete obj.gettersDictionnary.anyValue;

console.log(obj.gettersDictionnary.anyValue); //"undefined"

最后console.log应该给出"问题",为什么它没有?

以下是完整的代码段:



var obj = new (function () {
    
    var gettersDictionnary = {},
        valuesDictionnary = {
            anyValue: "problem"
        };
    
    Object.defineProperty(this, "gettersDictionnary", {
        configurable: false,
        get: function () {
            return gettersDictionnary;
        }
    });
    
    Object.defineProperty(gettersDictionnary, "anyValue", {
        configurable: true,
        get: function () {
            return valuesDictionnary["anyValue"];
        }
    });
    
})();

console.log(obj.gettersDictionnary.anyValue); //"problem"

delete obj.gettersDictionnary.anyValue;

console.log(obj.gettersDictionnary.anyValue); //"undefined"




1 个答案:

答案 0 :(得分:1)

以下是来自Ecmascript Spec:

delete运算符的语义
  

使用属性名称调用O的[[Delete]]内部方法时   P和布尔标志Throw,采取以下步骤:

     
      
  1. desc 成为调用 O 的[[GetOwnProperty]]内部方法的结果,其属性名称为 P
  2.   
  3. 如果 desc 未定义,则返回 true
  4.   
  5. 如果 desc 。[[Configurable]]为 true ,则      
        
    1. O 中删除名为 P 的属性。
    2.   
    3. 返回 true
    4.   
  6.   
  7. 如果投掷,则抛出 TypeError 例外。
  8.   
  9. 返回 false
  10.   

正如您所看到的,解决方案是使属性不是configurable