JavaScript:为不可枚举的属性赋值会将其更改为可枚举的?

标签 javascript enumerable assign defineproperty

我想我在这里误解了什么。我有一个对象,其中包含一个我希望不可枚举的属性。我希望能够从对象的函数本身为其赋值,但当我这样做时,该属性变为可枚举的。

例子:

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/

相关文章:

javascript - JSF h :outputScript ordering and PrimeFaces jQuery

javascript - 哪些文档描述了传递给 Express app.METHOD 回调参数的内容

c# - LINQ 的可枚举方法是否保持元素的相对顺序?

rust - 如何在 Rust 中处理/规避 "Cannot assign to ... which is behind a & reference"?

javascript - $.ajax JSON 未在完成时传递值

javascript - 如何使面板的高度取决于其他面板?

ruby - 通过注入(inject)进行条件总结

c# - Linq/Enumerable Any Vs 包含

C++ 模板完整指南。赋值运算符

Flutter GetX RxList 分配问题