3

JavaScript の「クラスレス性」を体験するための良いコード例を作成しようとしています。これは私がこれまでに思いついたものです:

function One() {}
function Two() {}

One.prototype.a = 5;
Two.prototype.b = 4;

var obj = new One();
print("1) ctor =", obj.constructor, "a =", obj.a, " b =", obj.b);
obj.constructor = Two;
print("1) ctor =", obj.constructor, "a =", obj.a, " b =", obj.b);

var objTwo = new obj.constructor();
print("2) ctor =", objTwo.constructor, "a =", objTwo.a, " b =", objTwo.b);

そして、これらは対応するプリントです:

1) ctor = function One() {
} a = 5  b = undefined
1) ctor = function Two() {
} a = 5  b = undefined
2) ctor = function Two() {
} a = undefined  b = 4

私の質問は、プロトタイプチェーンがここで本で機能しないのはなぜですか? JavaScript (spidermonkey) (spidermonkey-1.7) を使用して ideone で例を実行します。実際のプロトタイプは、constructor.prototype?以外の方法でアクセスされているようです。

PSさらなる実験では、に割り当てるとobj.constructor新しいプロパティが追加され、元のプロパティがシャドウされることが示されています。どうして?..

4

3 に答える 3

1

最初は、var objという名前のプロパティがありませんconstructor。印刷すると、そのプロトタイプ ( One.prototype) によって解決されます。すべてのプロトタイプにはコンストラクターがあります。割り当てるときに、プロトタイプ プロパティをシャドウobj.constructor = Twoする独自のプロパティを作成します。objこの新しい prop は、エンジンにとっては何の意味もなく、継承にもまったく影響しません。

一般に、「コンストラクター」は純粋な情報プロパティのように見え、特定の目的には役立ちません。これは、関数のプロトタイプから親関数への単なるバックリンクです。詳細については、関数の作成構成を参照してください。

于 2013-04-08T10:13:32.357 に答える
1

はい、ありObject.__proto__ますObject.prototype。One.prototype を印刷すると、目的の結果が表示されるはずです。これを行うconsole.dir(someInstance);と、インスタンス変数がすぐ下にリストされますsomeInstance

その後、 を展開するprototypeと、そのプロトタイプに対して定義したメソッドが表示されます (例: One.prototype.doSomething = function(a){});

詳細についてObject.__proto__こちらObject.prototypeを、 (標準)についてはこちらをご覧ください。

于 2013-04-08T09:28:46.410 に答える
0

ここでの問題は、メカニックに入ってからワイヤーを引っ張り始めたことです。このポインターを挿入して自然なシーケンスを中断したため、ここで実際に起こっていることは何もありません

obj.constructor = Two;

それは継承を行う適切な方法ではありません。これは:

function One() {}
function Two() {}

One.prototype.a = 5;
Two.prototype = new One();
Two.prototype.b = 4;

でインスタンス化されたオブジェクトは、コンストラクターで適切に関係 (継承)new Two()を表示します。is-a違いを示すjsFiddle Demoを次に示します。

于 2013-04-08T09:38:26.697 に答える