我們知道無論什麼時候只要創建了一個函數,就會為該函數創建一個prototype屬性,這個屬性指向函數的原型對象,預設情況下所有原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性包含了一個指向prototype屬性所在函數的指針。當調用構造函數創建一個新實例後,該實例內部就會包含 ...
我們知道無論什麼時候只要創建了一個函數,就會為該函數創建一個prototype屬性,這個屬性指向函數的原型對象,預設情況下所有原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性包含了一個指向prototype屬性所在函數的指針。當調用構造函數創建一個新實例後,該實例內部就會包含一個[[prototype]]指針(內部屬性),指向構造函數的原型對象。例如以下的代碼:
function Person(){ } Person.prototype.name = "pan"; Person.prototype.age = 23; }; var person1 = new Person();
這段代碼中Person構造函數、Person的原型屬性以及Person的現有實例person之間的關係可以用下圖來表示:
在這裡,Person.prototype指向了原型對象,而Person.prototype.constructor又回指了Person。實例person1包含了一個指向Person.prototype的內部屬性[[Prototype]]。
現在來看看我們上面的圖是否說對了呢?
function Person(){ } Person.prototype.name = "pan"; Person.prototype.age = 23; var person1 = new Person(); console.log(Person.prototype); console.log(person1.__proto__); console.log(Person.prototype.constructor); console.log(person1.__proto__.constructor); console.log(person1.name);
我們可以看到Person.prototype與person1.__proto__都是同一個對象Person{},所以Person.prototype.constructor和person1.__proto__.constructor都是Person這個函數。又因為person1可以利用原型鏈向上查找到Person.prototype的屬性並使用,所以person1.name的值為pan。