【问题标题】:Unexpected reference giving from a getter method来自 getter 方法的意外参考
【发布时间】:2015-10-08 22:12:41
【问题描述】:

这是一个对象 包含字符串列表(valuesDictionnary), 这些字符串可以从外部读取 对象的 getter 列表设置为 对象的属性(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 应该给出“问题”,为什么没有?

这里是完整的代码 sn-p:

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"

【问题讨论】:

标签: javascript pass-by-reference getter defineproperty


【解决方案1】:

这里是 delete 运算符的语义,来自 Ecmascript 规范:

当使用属性名调用O的[[Delete]]内部方法时 P 和 Boolean flag 抛出,采取以下步骤:

  1. desc 为调用属性名为 PO 的 [[GetOwnProperty]] 内部方法的结果。
  2. 如果 descundefined,则返回 true
  3. 如果 desc.[[Configurable]] 为 true,则
    1. O 中删除名称为 P 的自己的属性。
    2. 返回 true
  4. 否则如果抛出,则抛出TypeError异常。
  5. 返回 false

如您所见,解决方案是使属性不是configurable

【讨论】:

  • 感谢您的回答,我可能没有清楚地解释我的问题:此属性无法设置为可配置,因为由于某些原因它必须使用操作员delete 移除,但只能从内部移除对象块。因此,由于附加到对象“obj”的属性应该只给出变量的值,因此我使变量“getterDictionnary”具有只读访问权限。然后,预期的结果是删除运算符应用于“getterDictionnary”变量的副本,然后不删除“anyValue”属性。但它不起作用。
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 2011-08-15
  • 2021-08-26
  • 2014-11-10
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多