關(guān)鍵詞:
- prototype
- constructor
prototype和constructors是js中的兩個隱藏屬性壳嚎,在js中一切皆對象,所以理解這兩個屬性對理解js至關(guān)重要
constructor
拷貝所有構(gòu)造函數(shù)中的屬性躏嚎,用于檢測某個實例的構(gòu)造函數(shù)是哪一個,把實例和構(gòu)造函數(shù)連接在一起
// 新建一個對象
var Product = function (name,price) {
this.name = name;
this.price = price;
};
Product.prototype.showName = function () {
console.log(this.name);
};
var iPhone = new Product("蘋果7","7000");
console.dir(iPhone.constructor); //function Product(name, price)
console.dir(Product.constructor); // function Function()
我們看到完箩,實例化的iPhone通過constructor連接到了他的構(gòu)造函數(shù) Product 鹿霸,而 Product 連接到Function是什么意思呢,我們剛才說過js中一切皆對象泪电, Product其實是一個對象的實例化般妙,這個對象就是頂層函數(shù)對象Function
prototype
其實就是一個指針,保存的是地址歪架,將實例和原型對象連接在一起股冗。了解這個之前,我們先說一說屬性搜索機(jī)制
屬性搜索機(jī)制
先在自身屬性列表中尋找和蚪,如果找不到止状,就從原型prototype 中尋找,尋找的方法是找到自身的隱藏屬性prototype攒霹,這個屬性保存了自身的原型對象地址怯疤,通過這個地址,就可以尋找到需要的原型對象了
注意:原型不管實例化多少次催束,都只生成一次集峦,分配一次內(nèi)存,因此使用原型方法能夠提高運行速度,減小內(nèi)存空間
console.dir(iPhone.prototype); // undefined
console.dir(Product.prototype); // Object
在上面的代碼中塔淤,我們看到iPhone的原型返回了undefined摘昌,這是為什么呢,因為原型只存在原型對象中高蜂,實例化之后就不存在了聪黎,變成了這樣的形式 __proto __
console.dir(iPhone.__proto__); // Object
console.dir(Product.__proto__); // function anonymous()
但是有出現(xiàn)了問題,我們發(fā)現(xiàn)Product的__proto __指向一個亂七八糟的東西备恤,這是什么鬼案迨巍!B恫础喉镰!
其實,要調(diào)用構(gòu)造函數(shù)中的__proto __惭笑,必須加上原型
* console.dir(Product.prototype.__proto__); // Object
這樣就可以了
為了驗證我們上面所說侣姆,再寫幾行代碼測試一下
console.dir(iPhone.__proto__ === Product.prototype) //true
console.dir(Product.prototype.__proto__ === Object.prototype) //true
console.dir(Object.prototype.__proto__) //null
console.dir(Product.prototype.constructor === Product) //true
console.dir(Function.prototype.constructor === Function) //true
console.dir(Object.prototype.constructor === Object) //true
其實說白了,proto是什么脖咐,就是神乎其神的原型鏈
啊
本來想畫個圖解釋下铺敌,想想麻煩,復(fù)制個連接吧屁擅!這位大牛解釋的相當(dāng)完美3テ尽!派歌!
http://www.108js.com/article/article1/10201.html?id=1092