2012-01-24 17 views
0

考慮下面的代碼:試圖總結我的頭周圍的物體,建設者和原型

function Robot(weapon) { 
    this.weapon = weapon; 
    this.fire = function() { 
     alert('Firing ' + this.weapon + 'projectile.'); 
    }; 
} 

var gunRobot = new Robot('gun'); 

function makeRobot(weapon) { 
    return { 
     weapon: weapon, 
     fire: function() { 
      alert('Firing ' + this.weapon + 'projectile.'); 
     } 
    }; 
} 

var laserRobot = makeRobot('laser'); 

所以,如果我理解正確的,這兩者之間的主要區別在於:在第一個示例中,gunRobot具有指向Robot的構造函數屬性,而在第二個示例中,laserRobot具有指向Object的構造函數屬性。兩者都沒有添加任何東西到他們的原型,對吧?現在

,如果我第一個例子改爲:

function Robot(weapon) { 
    this.weapon = weapon; 
} 

Robot.prototype.fire = function() { 
     alert('Firing ' + this.weapon + 'projectile.'); 
}; 

var gunRobot = new Robot('gun'); 

gunRobot的constructor屬性指向機器人的構造函數,其原型屬性具有屬性火。現在,如果我叫

gunRobot.fire(); 

如,gunRobot沒有按沒有火屬性,下了原型在原型鏈被訪問並檢查了火屬性,對不對?我主要是一個Java程序員,所以圍繞面向對象的JS概念來包裝我的頭很困難:-)。

+0

權。你有什麼問題? –

回答

1

真的,真的非常接近,但考慮到這句話...

「gunRobot的constructor屬性指向機器人的構造函數,其原型屬性具有屬性火」。

...看來,你可能會認爲它是通過constructor屬性,gunRobot將訪問其prototype對象。

這將是不正確的。對象gunRobot沒有自己的屬性constructor,但該屬性實際上是對象本身的成員。

prototype對象被引用的方式是內部的,因此是隱含的。

這意味着...

  • 你可以遮蔽gunRobot對象的constructor屬性,仍然有你的prototype對象的隱式引用

  • 您可以刪除從該constructor財產prototype對象,並且prototype鏈將不受影響

  • 如果你完全替換了構造函數的prototype對象,任何已經從構造函數創建的對象都看不到變化。他們的prototype對象引用是永久的。只有新對象纔會有對新對象的內部引用。


,並且相對於這個問題......

「無論是不加任何東西到他們的原型,對吧?」

...你是正確的,什麼也沒有加入任一對象的prototype對象。 (當然,默認Object.prototype對象具有某些默認屬性。)


  • gunRobot ---->Robot.prototype(空對象)

  • Robot.prototype ---->Object.prototype

  • Object.prototype ---->null


  • laserRobot ---->Object.prototype

  • Object.prototype ---->null

相關問題