javascript中constructor指向問題

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

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

由上面的代碼咱們總結出結論1:上面的代碼在控制檯能夠看出constructor是指向構造器Fruit的引用。ui

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到底指向的是那個實例的構造器?this

根據上面的代碼總結出結論2:constructor指向的是原型對象的構造器的引用spa

   apple.constructor==Apple.prototype.constructorprototype

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

或者code

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

打印的都是水果。對象

咱們如今想讓他執行的是蘋果的打印;這個時候就須要對constructor的指向進行從新指定。blog

根據上面的兩個結論:不管是修改實例的constructor仍是構造器的原型constructor屬性都是能夠達到目的的繼承

能夠在重寫了prototype屬性的代碼後寫下這樣的代碼原型

Apple.prototype.constructor=Apple;

或者在實例化後對實例的constructor進行從新制定。

 apple.constructor=Apple;

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

第二種方式須要有一個實例化的對象,而咱們只用在對繼承的建立完成後纔會去實例化,

等有了實例化對象在去修改constructor,這個時候已經遲了,意義已經不大了,繼承的關係已經肯定了。

相關文章
相關標籤/搜索