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()创建 的对象都是函数对象,其他都是普通对象
**注意: 所有对象都有__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)的一个实例。