gpt4 book ai didi

javascript - 在对象原型(prototype)上设置可枚举属性

转载 作者:搜寻专家 更新时间:2023-11-01 00:45:00 25 4
gpt4 key购买 nike

我正在尝试使用 setter 在对象原型(prototype)上设置可枚举属性。

function Foo(){}
Object.defineProperty(Foo.prototype, 'tag', {
enumerable: true, configurable: true,
set: function(x){
if(typeof(x) == "string") {
Object.defineProperty(this, 'tag', {value: x});
}
}
});
var bar = new Foo();

bar.tag = 7; console.log(bar.tag); // undefined
bar.tag = "baz"; console.log(bar.tag); // "baz"

console.log(bar); // {}
console.log(bar.propertyIsEnumerable('tag')); // false

除最后两行外,一切都按预期工作。
我刚刚测试了 Node v0.10.25 中的代码。我不明白为什么属性标签不可枚举。
作为一种解决方法,我在构造函数中使用 Object.defineProperty 来对抗 this 而不是 Foo.prototype,但我想了解为什么 javascript 中的对象不能继承来自可枚举的属性。

最佳答案

问题是您的两个 Object.defineProperty 调用定义了不同的属性:

  • 原型(prototype)上的一个 setter 属性
  • 每个 this 上的一个值属性,即实例

虽然原型(prototype)上的描述符是可枚举和可配置的,但实例属性不会“继承”这些描述符;他们会default to false在新的描述符上。您需要明确设置它们:

Object.defineProperty(Foo.prototype, 'tag', {
enumerable: true, configurable: true,
set: function(x){
if (typeof(x) == "string")
Object.defineProperty(this, 'tag', {
enumerable:true, configurable:true, // still non-writable
value: x
});
}
});

关于javascript - 在对象原型(prototype)上设置可枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21546330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com