你將學到:
* 每個函數中都有一個prototype屬性,該屬性所存儲的就是原型對象;
* 為原型對象添加屬性;
* 使用原型對象的新增屬性;
* 區分對象自身屬性和原型屬性;
* __proto__,用于保存各對象原型的神秘鏈接;
* 介紹原型方法
* 強化內建對象
*****
# 原型屬性 prototype
## 添加方法和屬性
* 新建對象時添加方法和屬性
* 通過構造器函數的prototype屬性來增加該構造器所能提供的功能
## 使用原型的方法和屬性
理解原型的"live"駐留概念
對象都是通過傳引用的方式傳遞的,新對象的的屬性和方法指向原型對象,共享一份屬性和方法。當我們修改原型,則相關對象也都會修改。
```
function Gadget(name, color){
this.name = name;
this.color = color;
this.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}
}
Gadget.prototype
// {constructor: ?}
// constructor: ? Gadget(name, color)__proto__: Object
Gadget.prototype = {
price: 100,
rating: 3,
getInfo: function(){
return 'Rating: ' + this.rating + ', price: ' + this.price;
}
}
var newtoy = new Gadget('webcam', 'black');
newtoy.color;
// "black"
newtoy.name
// "webcam"
newtoy.whatAreYou();
// "I am a black webcam"
newtoy.price;
// 100
newtoy.rating;
// 3
newtoy.getInfo();
// "Rating: 3, price: 100"
Gadget.prototype.get = function(what){
return this[what];
};
newtoy.get('price');
// 100
newtoy.get('color');
// "black"
```
## 自身屬性與原型屬性
自身屬性 --> 原型屬性obj.constructor.prototype(亦 obj.__proto__)
每個對象都會有一個構造器,原型也是對象,原型也有構造器,構造器又會有自己的原型。這就形成了一個原型鏈 prototype chain,最后一環一定時Object內建對象。
## 自身屬性重寫原型屬性
自身屬性優先于原型屬性,屬性重名的情況下。
判斷可枚舉屬性的方法 `propertyIsEnumerable()`
判斷屬性歸自身還是原型 `hasOwnProperty()`
所有原型屬性,`propertyIsEnumerable()`都會返回false
## isPropertyOf()
當前對象是否是另一個對象的原型
## __proto__
構造器是中轉站,一頭是對象,一頭是原型對象
__proto__實際上是某個實體對象的屬性;
prototype是屬于構造器函數的屬性。
# 擴展內建對象
通過內建構造函數的prototype增加方法;
??如果想要通過原型為某個對象添加一個新屬性,務必先檢查一下該屬性是否已經存在。
```
if(!String.prototype.reverse){
String.prototype.reverse = function(){...}
}
```
## 原型陷阱
??當我們重寫某對象的prototype時,重置相應的constructor屬性!
```
Dog.prototype = {k:v};
Dog.prototype.constructor = Dog;
```