1

1.

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype = {protest:"maizere"};

[ myobject instanceof MyConstructor,     // false !
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ]           // true
console.log(myobject.protest)          //undefined

これは、myobject が MyConstructor プロトタイプからプロパティとメソッドを継承していないことを証明しています。

ただし、以下の次のコードを参照してください。

2.

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype.protest= "Maizere";//Do this line gets hoisted?or something else

[ myobject instanceof MyConstructor,     // true!
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ]           // true
console.log(myobject.protest)          //Maizere

なぜこれが起こっているのですか?内部プロトタイプの正確な定義は何ですか?これは、オブジェクトのインスタンス化の後でも、protoが MyConstructor プロトタイプを参照していることを証明しています。2 番目のコードでオブジェクトをインスタンス化した後にプロパティが追加され、オブジェクトの内部プロトタイプがそれを受け取るため、後でプロトタイプ プロパティを変更しても、インスタンスで効果を確認できます。ただし、同じ定義は機能しません。最初のコードでプロトタイプ プロパティが置き換えられるのはいつですか?

4

3 に答える 3

1

私はこれに間違っているかもしれませんが、そうすると次のようになります。

MyConstructor.prototype = {protest:"maizere"};

プロトタイプを匿名オブジェクト定義でオーバーライドしているため、次のような新しいプロパティを追加するだけです。

MyConstructor.prototype.protest= {"Maizere"};

あなたのクラスはプロトタイプを保持し、魅力的に機能します。

于 2013-01-31T03:48:21.513 に答える
0

MyConstructor.prototype =オブジェクト全体を上書きしprototypeます。

instanceofオペレーターは、オブジェクトのプロトタイプ チェーンにコンストラクターのプロトタイプ プロパティがあるかどうかをテストします。

http://jsfiddle.net/ExplosionPIlls/xtqhp/

function MyConstructor () {}
MyConstructor.prototype = {'xyz': 'zyx'};
//true
console.log((new MyConstructor) instanceof MyConstructor);

function MyConstructor2 () {}
var mc2 = new MyConstructor2;
MyConstructor2.prototype = {'xyz': 'zyx'};
//false
console.log(mc2 instanceof MyConstructor2);

ちなみに、MyConstructor.prototype.protest = {"Maizere"};は有効な構文ではありません。

于 2013-01-31T03:48:56.367 に答える
0

ですから、これが私がこの記事をブックマークした理由の 1 つです。

少し紛らわしいと考えられるコンストラクター

基本的に、コードの最初のブロックで起こっていることは、MyConstructor のプロトタイプ オブジェクトを新しいオブジェクトで上書きしていることです。一方、2 番目のブロックでは、既存のプロトタイプ オブジェクトにプロパティを追加しています。

于 2013-01-31T03:50:01.930 に答える