1

最初のコード:

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype = {};

[ myobject instanceof MyConstructor,   // false - why?
myobject.constructor == MyConstructor, // true
myobject instanceof Object ]           // true

MyConstructor.prototype置き換えられてもmyobject、プロパティはから継承されMyconstructor.prototypeます。では、なぜmyobject instanceOf Myconstuctor間違っているのでしょうか。

function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject instanceof MyConstructor  // true (it is because myobject still inherits from
                                   // Myconstructor.prototype although it has been replaced)

2番目:

 function MyConstructor() {}
 MyConstructor.prototype = {};
 var myobject = new MyConstructor();

 myobject.constructor == MyConstructor;  // false (accepted )

したがって、myobject.constructorがObjectである場合、最初の例ではそれを指していないのですが、最初の例では、それ以降、どのようにまだ指すことができますmyobject.constructorか。MyConstructorMyconstructor.prototype

これを明確にしていただけますか?

4

1 に答える 1

4

MyConstructor.prototype が置き換えられても、myobject は引き続き Myconstructor.prototype からプロパティを継承します。

いいえ。置き換えられた古いオブジェクトから継承します。そのオブジェクトは!== MyConstructor.prototypeであるため、instanceof演算子は false を返します。2 番目の例でmyobjectは、 は新しいプロトタイプ (現在のMyConstructor.prototype)から継承してinstanceofいます。

したがって、 myobject.constructor の場合

プロパティはconstructorとはまったく関係ありませんinstanceof

function Constructor() {}
var oldProto = Constructor.prototype;
var oldInstance = new Constructor();

Constructor.prototype = {constructor:"something else"};
var newProto = Constructor.prototype;
var newInstance = new Constructor();

// all these are true:
Object.getPrototypeOf(oldInstance) === oldProto;
Object.getPrototypeOf(newInstance) == newProto;
oldProto !== newProto;
oldProto.constructor === Constructor; // was set implicitly on creating the function
oldInstance.constructor === oldProto.constructor; // inherited
newProto.constructor === "something else"; // if not explicitly set, comes from Object.prototype
newInstance.constructor === newProto.constructor; // inherited

Constructor.prototype === newProto;
newInstance instanceof Constructor; // because the above

Constructor.prototype !== oldProto;
! (oldInstance instanceof Constructor) // because the above
于 2013-01-28T18:09:23.993 に答える