这是一个对象
包含字符串列表(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"

答案 0 :(得分:1)
以下是来自Ecmascript Spec:
的delete
运算符的语义
使用属性名称调用O的[[Delete]]内部方法时 P和布尔标志Throw,采取以下步骤:
- 让 desc 成为调用 O 的[[GetOwnProperty]]内部方法的结果,其属性名称为 P 。
- 如果 desc 未定义,则返回 true 。
- 如果 desc 。[[Configurable]]为 true ,则
- 从 O 中删除名为 P 的属性。
- 返回 true 。
- 如果投掷,则抛出 TypeError 例外。
- 返回 false 。
醇>
正如您所看到的,解决方案是使属性不是configurable
。