javascript 中每個對象都會有一個特殊的內置屬性[[prototype]],這個就是對其餘對象對引用。有了這個做爲基礎去關聯其餘對象,就能理解繼承機制。Chrome瀏覽器下,咱們能夠經過xxObj.__proto__去訪問這個[[prototype]]javascript
注意,[[prototype]]與prototype不同。任何一個對象都有[[prototype]],只有function纔有prototype屬性java
function Foo(){ } var a = new Foo(); console.log(a.constructor === Foo.prototype.constructor); // true console.log(a.__proto__ === Foo.prototype); // true
本例子a 實例的__proto__ 和 constructor 在new操做的時候象默認生成的嗎?瀏覽器
答案不是。ide
實際上的__proto__ 和 constructor 並不存在a這個實例上,它跟其餘的函數,好比toString,isPrototypeOf同樣,內置在Object中,並且這些方法屬性不可枚舉。函數
咱們能夠換一個方式理解__proto__ui
Object.defineProperty(Object.prototype,"__proto__",{ get: function(){ return Object.getPrototypeOf(this); }, set: function(o){ Object.setPrototype(this,o); } })
所以,當一個對象實例,例如a, a.__proto__就調用了a.__proto__()
這個方法,也就是調用getter函數。this