原型鏈 對象 對象: 1,函數對象:有function創造出來的函數 2,普通對象:除開函數對象之外的對象,都是普通對象 即普通對象obj是構造函數Object的一個實例,因此: obj.__proto__ === Object.prototype ` 但凡通過new Function()創建 的對 ...
原型鏈
對象
對象:
1,函數對象:由function創造出來的函數
2,普通對象:除開函數對象之外的對象,都是普通對象
**即普通對象obj是構造函數Object的一個實例,因此:
obj.__proto__ === Object.prototype**
//普通對象
var obj = {}
var obj1 = new Object()
console.log(obj.__proto__ === obj1.__proto__); //true
console.log(obj.__proto__ === Object.prototype); //true
但凡通過new Function()創建 的對象都是函數對象,其他都是普通對象
**註意: 所有對象都有__proto__屬性,只有函數對象才有prototype屬性**
3,原型對象:prototype屬性也叫原型對象,主要為了實現繼承
**指針__proto__: js中,萬物皆對象!所有obj都具有proto屬性(null和undefined除外),而且指向創造obj對象的函數對象(生成實例的構造函數)的prototype屬性:**
function Person(name) {
this.name = name;
}
function Mother() {
}
Mother.prototype = { //Mother的原型
age: 18,
home: ['家裡蹲']
}
Person.prototype = new Mother() //Person的原型為Mother
Person 構造函數的原型對象 是 Mother ()。相當於原型(prototype)
是媽媽,Person現在是兒子。
let a = new Person()
let b = new Person('豬腦殼子')
console.log(a.age); // 18
console.log(b.name, b.home); //豬腦殼子 ["家裡蹲"]
console.log(a.__proto__); //__proto__: age: 18 home: Array(1) 0: "家裡蹲"length: 1
**在a和b的實例中,__proto__屬性,指向的都是它們的構造函數Person對象的prototype屬性,所對應的對象也就是Mother()**
**一個構造函數對象的原型(prototype)
,就相當於他媽,這個構造函數對象的實例,就相當於他媽不同的孩子
,而每個實例中的__proto__屬性,就指向它們共同的媽媽!也就是構造函數對象的prototype屬性**
****當我們輸入 b.name 的時候,原型鏈的搜索機制是先在實例中搜索相應的值
,找不到就通過它__proto__指針,在原型中找
,還找不到就再往上一級原型中搜索……一直到了原型鏈的終點
(就是js自帶的Object,它的原型比較特殊,為null ),就是到null還沒找到的話,就返回一個 undefined。****
構造器constructor : 每一個對象中的constructor 屬性返回創建此對象的函數對象的引用;例如:
function Cat(name,color) {
this.name = name;
this.color =color;
}
var cat1 = new Cat('小黑','白色')
console.log(cat1.constructor === Cat) //true
console.log(cat1); //Cat {name: "小黑", color: "白色"}
在預設情況下,所有的原型對象都會自動獲得一個constructor(構造函數)屬性
,這個屬性(是一個指針)指向 prototype 屬性所在的函數(Person)
上面這句話有點拗口,我們「翻譯」一下:A 有一個預設的 constructor 屬性,這個屬性是一個指針,指向 Person。即:
Person.prototype.constructor === Person
實例的構造函數屬性(constructor)
指向構造函數 :person1.constructor == Person
person1 為什麼有 constructor 屬性?那是因為 person1 是 Person 的實例。
那 Person.prototype 為什麼有 constructor 屬性??同理, Person.prototype (你把它想象成 A) 也是Person 的實例。
也就是在 Person 創建的時候,創建了一個它的實例對象並賦值給它的 prototype,基本過程如下:
var A = new Person();
Person.prototype = A;
結論:原型對象(Person.prototype)是 構造函數(Person)的一個實例。