- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想我在这里误解了什么。我有一个对象,其中包含一个我希望不可枚举的属性。我希望能够从对象的函数本身为其赋值,但当我这样做时,该属性变为可枚举的。
例子:
function ObjectNode() {
}
Object.defineProperty(ObjectNode.prototype, "parent", {
value:null
// enumerable and configurable default to false
}
// Pass an ObjectNode instance and set this object node as its parent
ObjectNode.prototype.addChild = function(node) {
node.parent = this; // <-- node.parent is now enumerable
...more code...
};
实际发生的是,为 node.parent 分配一个值会创建一个名为 parent 的新“自己的”属性,它会覆盖原始属性。
有没有一种方法可以在不这样做的情况下在内部为不可枚举的属性赋值?或者我是否必须求助于在闭包中引用变量的 getter/setter 属性?
编辑:
GGG 的回答值得称赞,因为正是他的建议让我得出了最终答案。
我想做的是从“for(key in object)”语句中隐藏一个简单的属性。我能够这样做:
function ObjectNode() {
Object.defineProperty(this, "parent", {
value:null,
writable:true
});
}
一开始我对此犹豫不决的一个原因是错误地理解我不希望每个实例都重新创建该属性。但是,呃,这就是实例属性!!!
谢谢 GGG 帮助我重新调整我的大脑!
最佳答案
您已经创建了不可配置的原型(prototype)属性的属性,但它仍然可以被构造函数创建的对象的属性遮蔽。
function ObjectNode() {
}
Object.defineProperty(ObjectNode.prototype, "parent", {
value: null,
configurable: false
})
ObjectNode.prototype.addChild = function (node) {
node.parent = this; // <-- node.parent is now enumerable
}
var mom = new ObjectNode();
var kid = new ObjectNode();
mom.addChild(kid);
console.log(kid.parent == mom); // works, logs true
kid.parent = "foo";
console.log(kid.parent); // works, logs "foo"
ObjectNode.prototype.parent = "foo";
console.log(ObjectNode.prototype.parent); // fails, logs null
要记住的是,对象的属性只是该对象的属性,而不是原型(prototype)链中具有该对象的其他对象的属性。相反,尝试在构造函数中为新对象创建一个不可配置的属性:
function ObjectNode() {
Object.defineProperty(this, "parent", {
value: null,
configurable: false
})
}
当然,这会阻止您的 addChild
函数工作,因为该属性不再是可配置的。您可以考虑改为在该函数中定义该属性,但在使用 addChild
设置它之前,它仍然是可配置的。
总而言之,一般来说,最好的选择是不要担心让事情变得不可配置,如果它不是绝对关键的话(而且我不确定它会是什么情况)。很长一段时间没有这个功能,世界也过得很好。 ;)
关于JavaScript:为不可枚举的属性赋值会将其更改为可枚举的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14514431/
我是一名优秀的程序员,十分优秀!