1. 程式人生 > 實用技巧 >javascript中constructor指向問題

javascript中constructor指向問題

首先用一個例子指出來constructor存在形式。

function Fruit(){ }
var f=new Fruit();
console.log(f.constructor);//打印出Fruit()

由上面的程式碼我們總結出結論1:上面的程式碼在控制檯可以看出constructor是指向構造器Fruit的引用。

function Fruit(){ this.name="水果"}
//var f=new Fruit();
function Apple(){this.name="蘋果";}
Apple.prototype=new Fruit();
var apple=new Apple();
console.log(apple.constructor);
//依然打印出Fruit() Apple.prototype={};//空物件的構造器是Object() apple=new Apple(); console.log(apple.constructor);//指向Object()

這個地方就有點奇怪了。這個constructor到底指向的是那個例項的構造器?

根據上面的程式碼總結出結論2:constructor指向的是原型物件的構造器的引用

apple.constructor==Apple.prototype.constructor

var apple2=new apple.constructor();
console.log(apple2.name);

或者

var apple2=new Apple.prototype.constructor();
console.log(apple2.name);

列印的都是水果。

我們現在想讓他執行的是蘋果的列印;這個時候就需要對constructor的指向進行重新指定。

根據上面的兩個結論:無論是修改例項的constructor還是構造器的原型constructor屬性都是可以達到目的的

可以在重寫了prototype屬性的程式碼後寫下這樣的程式碼

Apple.prototype.constructor=Apple;

或者在例項化後對例項的constructor進行重新制定。

 apple.constructor=Apple;

雖然上面的兩種方式都能達到目的,但是推薦使用第一種。

第二種方式需要有一個例項化的物件,而我們只用在對繼承的建立完成後才會去例項化,

等有了例項化物件在去修改constructor,這個時候已經遲了,意義已經不大了,繼承的關係已經確定了。