有人可以請解釋這種行爲給我。奇怪的行爲與建設者
首先讓我們創建一個構造函數和使用構造一個新的對象:如預期
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 ---
只是爲了澄清。如果你創建一個新的功能:
var MyConstructor = function() {};
然後Javascript實現也將創造一個新的對象:
var temp = { constructor: MyConstructor };
並將其設置爲:
MyConstructor.prototype = temp;
這裏要注意的一點是,臨時對象將覆蓋constructor
字段Object.prototype
(默認情況下爲Object.prototype.constructor === Object
)。
所以,當我使用構造函數創建一個新的對象:
var obj = new MyConstructor();
那麼對象繼承指向MyConstructor
構造領域。在第二種情況下沒有覆蓋,所以第二個對象直接從Object.prototype
繼承構造函數字段。
你應該值MyConstructor2新設置的原型對象添加一個constructor屬性(myProto) – Redu