現在a.constructor和b.constructor都指向函數 A,這是預期的。但是,c.constructor指向一個void 對象。 一個和b都具有原始A.prototype對象作爲它們的內部[[Prototype]]
,其具有構造屬性引用甲。所以,當你這樣做:
這背後的理由是什麼?謝謝。
a.constructor
它是用來繼承構造財產。
然後,您用一個新的「空」對象替換原始對象,該對象不具有構造函數屬性。替換構造函數的原型不會更改現有實例的內部[[Prototype]]
,它們仍會引用在構建時爲原型的對象。
新對象將只用作[[Prototype]]
新的實例,所以當你構建Ç,它的內部[[Prototype]]
是一個沒有構造財產這一新的對象,因此它沿[[Prototype]]
鏈繼續,直到構造函數屬性找到Object.prototoype,其中引用對象的構造函數。
var A = function() {};
var a = new A();
var b = new A();
A.prototype.member1 = 10;
// Replace A.prototype
A.prototype = {}
var c = new A();
// a still uses original prototype, so inherits member1
console.log(a.member1); // 10
// c uses the plain object, so doesn't have member1 property
console.log(c.member1); // undefined
// c inherits constructor property from Object.prototype, so
// references Object constructor
console.log(c.constructor === Object); // true
https://stackoverflow.com/questions/17474390/defining-a-javascript-prototype – Bergi
@RobG'Object.prototype.constructor == Object'是他的意思 – Bergi