前言:原型與原型鏈這一塊是學習js最重要的也是最難理解的一部分對我來說,所以今天就整理下這塊的知識點。
一、構造函數
1、什麼是構造函數:構造函數就是通過new關鍵詞生成實例的函數。
2、構造函數特點:
- 需要new實例化。
- 內部使用this對象指向即將要生成的實例對象
- 首字母大寫,用於區分普通函數
function Person( name,age) {
this.name = name;
this.age = age ;
this.sayName= function(){
console.log(this.name);
}
}
var p = new Person('xiaoming',18);
補充下new的作用:調用new 方法之後
- 執行該函數
- 隱式創建一個對象
- 把該對象和函數的this執行綁定
- 把加在this上的屬性和都加到該對象上
- 函數執行完畢,返回該對象
二、prototype
原型:在JS中,每個函數都有一個屬性叫做prototype,prototype本身是一個對象,在該對象裏我們可以定義一些該函數的實例化對象的共用方法,避免重複創建方法。
一些在實例化對象中可以通用的數據或方法,如果我們都直接寫在對象中,那每實例化一個對象都多一堆數據,這樣的話,比較佔用內存。
三、__proto__
__proto__:在JS中,每個對象都有一個屬性__proto__(隱式原型),指向該對象構造函數的原型。
四、constructor
constructor:在原型對象中有一個constructor屬性,指向該原型對象的構造函數。
function Person() {}
var xiaowang = new Person()
console.log(xiaowang.__proto__ ===Person.prototype)//true
console.log(Person.prototype.constructor ===Person)//true
var o={};
o.__proto__=== Object.prototype
五、原型鏈
原型鏈:當我們調用對象的某個方式(屬性)時,會先在該對象自身查找。如果找不到,就通過對象的__proto__屬性,找到其構造函數的prototype對象,從這裏找這個方法。如果還找不到就找prototype(Object)的構造函數(Object)中的prototype,如果還找不到就報undefined。