4

関数が呼び出されたときに、プロトタイプのプロパティを自分自身に設定する必要があるJS仕様のどこにも見つかりません。newconstructor

確かに、仕様には、組み込みコンストラクター (オブジェクト、配列、文​​字列、&c) がすべてprototype.constructorプロパティを自分自身に設定しObject.prototype.constructor = Objectていると書かれています (つまり)。[[Construct]]セクション(13.2.2 )に出[[Construct]]ていますが、そうではありません:

function F() {};
var obj = new F();
Object.getPrototypeOf(obj).constructor == F;  // non-standard??  I can't find where in spec

コンストラクターのprototype.constructorプロパティをそれ自体に「リセット」する多くのコードを見ているので、私は尋ねます-それでも、このプロパティが最初にコンストラクター関数を指すことは非標準のようです?

function F() {};
F.prototype = new Parent();
F.prototype.constructor = F;  // 'reset' it cuz it changed! (according to spec it should never have been set?  Except in Object.prototype.

JS プログラマーは、prototype プロパティが設定されていない場合、コンストラクターのprototype.constructor プロパティがコンストラクター関数自体を指すというこの非標準(?) 期待に頼ることができますか?

V8は確かにこれを行います:

function F() {};
console.log(F.prototype.constructor === F); // true!  WHY???  not in spec?  Should be Object?

漠然とした意味があったことを願っています-ありがとう!! マーク

PSそれらの可変性のために、私はプロパティinstanceofを使用する代わりに依存するだけです。constructor

4

1 に答える 1

4

.prototypeすべての関数には、関数を指すプロパティを持つオブジェクトを指すプロパティを持つのが標準です.constructor

13.2関数オブジェクトの作成

1)新しいネイティブECMAScriptオブジェクトを作成し、Fそのオブジェクトにします。

..。

16)protoを、式によって構築される新しいオブジェクトを作成した結果としますnew Object()。ここで、Objectは、その名前の標準の組み込みコンストラクターです。

17)引数、プロパティ記述子、およびfalse[[DefineOwnProperty]]を使用してprotoの内部メソッドを呼び出します。"constructor"{[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}

18)引数、プロパティ記述子、およびfalseを使用しての[[DefineOwnProperty]]内部メソッドを呼び出します。F"prototype"{[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}

Fつまり、は新しい関数でprotoあり、プロトタイプオブジェクトであることがわかります。はproto"constructor"を指すプロパティをF取得Fし、オブジェクト"prototype"を指すプロパティを取得しますproto

于 2012-12-06T18:08:15.637 に答える