3

ここで何かを誤解していると思います。列挙不可にしたいプロパティを含むオブジェクトがあります。オブジェクトの関数自体から値を代入できるようにしたいのですが、そうすると、プロパティが列挙可能になります。

例:

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
    });
}

私が最初からこれに躊躇した理由の 1 つは、各インスタンスでプロパティを再作成したくないという誤った理解でした。しかし、まあ、それがインスタンスプロパティです!!!

GGG、脳の再調整を手伝ってくれてありがとう!

4

1 に答える 1

2

構成不可能なプロトタイプ プロパティのプロパティを作成しましたが、コンストラクタによって作成されたオブジェクトのプロパティによってシャドウされる可能性があります。

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

覚えておくべきことは、オブジェクトのプロパティはそのオブジェクトのみのプロパティであり、プロトタイプ チェーンにそのオブジェクトを持つ他のオブジェクトのプロパティではないということです。代わりに、コンストラクターで新しいオブジェクトの構成不可能なプロパティを作成してみてください。

function ObjectNode() {
    Object.defineProperty(this, "parent", {
        value: null,
        configurable: false
    })
}

もちろん、これによりaddChild、プロパティが構成できなくなるため、関数が機能しなくなります。代わりにその関数でプロパティを定義することを検討できますが、で設定されるまでは引き続き構成可能addChildです。

全体として、一般的に最善の策は、絶対に重要でない場合は、構成不可能にすることを心配しないことです (それがどのような場合になるかはわかりません)。世界は長い間、その機能がなくてもうまくいっています。;)

于 2013-01-25T03:08:19.710 に答える