JavaScript是面向對象的,每個實例對象都有一個__proto__屬性,該屬性指向它的原型對象,這個實例對象的構造函數有一個原型屬性prototype,與實例的proto屬性指向同一個對象。當一個對象在查找一個屬性的時候,自身沒有就會根據__proto__向它的原型進行查找,如果都沒有,則向它的原型的原型繼續查找,直到查到Object.prototype.proto_為null,這樣也就形成了原型鏈。
原型對象和實例之間有什么作用呢?
通過一個構造函數創建出來的多個實例,如果都要添加一個方法,給每個實例去添加並不是一個明智的選擇。這時就該用上原型了。
在實例的原型上添加一個方法,這個原型的所有實例便都有了這個方法。
var M = function (name) { this.name = name; } var o3 = new M('o3')
-
實例就是對象,在本例中o3就是實例,M就是構造函數。
-
實例通過new一個構造函數生成的。
-
從上圖中可以知道,實例的proto指向的是原型對象。
-
實例的構造函數的prototype也是指向的原型對象。
-
原型對象的construor指向的是構造函數。
補充:
只有函數有prototype,對象是沒有的。
但是函數也是有proto的,因為函數也是對象。函數的proto指向的是Function.prototype。