2017-06-01 90 views
0

在下面的例子:爲什麼在這種情況下`.constructor`指向`object`?

var A = function() {}; 
var a = new A(); 
var b = new A(); 
A.prototype.member1 = 10; 

A.prototype = {} 
var c = new A(); 

現在a.constructorb.constructor都指向function A,預計。 但是,c.constructor指向空白object

這背後的基本原理是什麼?謝謝。

+0

https://stackoverflow.com/questions/17474390/defining-a-javascript-prototype – Bergi

+0

@RobG'Object.prototype.constructor == Object'是他的意思 – Bergi

回答

1

現在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

+0

我'爲'c.constructor'獲取'Object',而不是'undefined' – Bergi

+0

@ Bergi-ah是的,當然,它正在經歷Object.prototype ...固定。 – RobG

相關問題