js原型鏈的見解

原型鏈

對象

對象:
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()建立 的對象都是函數對象,其餘都是普通對象this

**注意: 全部對象都有__proto__屬性,只有函數對象纔有prototype屬性**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如今是兒子。code

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)的一個實例。

相關文章
相關標籤/搜索