誰かがこの動作を私に説明できますか?コンストラクタでの奇妙な振る舞い
まず者は、コンストラクタを使用して、コンストラクタ、新しいオブジェクトを作成してみましょう:予想通り
var MyConstructor = function() {};
var obj = new MyConstructor();
すべてがある:
console.log(obj.constructor === MyConstructor); //true
console.log(obj.__proto__ === MyConstructor.prototype); //true
のは、もう一度試してみようが、今回は、のがにカスタムプロトタイプを追加してみましょうコンストラクタ:
var MyConstructor2 = function() {};
var myProto = { fld: 'val' };
MyConstructor2.prototype = myProto;
var obj2 = new MyConstructor2();
ここでは、私が期待しているものではありません:
console.log(obj2.constructor === MyConstructor2); //false?!?!
console.log(obj2.constructor === Object); //true, b-but i didnt use Object..
console.log(obj2.__proto__ === MyConstructor2.prototype); //true
なぜobj2.constructor
はObject
なくMyConstructor2
を参照していますか?
--- edit1 ---
ちょうど明確にする。あなたは新しい関数を作成した場合:ここで注意すべき事はということです
MyConstructor.prototype = temp;
:
var MyConstructor = function() {};
をその後、Javascriptの実装は、新しいオブジェクトを作成します:
var temp = { constructor: MyConstructor };
をし、それを設定しますtempオブジェクトはフィールドをObject.prototype
(デフォルトではObject.prototype.constructor === Object
)から上書きします。
は、だから私は、コンストラクタを使用して新しいオブジェクトを作成するとき:
var obj = new MyConstructor();
は、そのオブジェクトは、
MyConstructor
を指すコンストラクタフィールドを継承します。 2番目のケースでは上書きはなかったので、2番目のオブジェクトはコンストラクタフィールドを直接
Object.prototype
から継承しました。
新しく設定したプロトタイプオブジェクト(myProto)に値MyConstructor2のコンストラクタプロパティを追加する必要があります。 – Redu