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)的一个实例。

相关文章
相关标签/搜索