对象的__proto__
js中万物皆对象,每个数据都会有一个__proto__的属性,这个属性叫隐式原型。
一个对象(obj)的隐式原型(proto)指向构造该对象(obj)的构造函数(Object())的原型属性(Object.prototype)。
这样做的原因是为了能够保证实例(obj)能够访问到在构造函数(Object())的原型属性(Object.prototype)中定义的属性和方法。
function createPerson(){
}
console.log(createPerson.prototype);
var p1 = new createPerson();
console.log(p1);
console.log(p1.__proto__); // 是一个对象,起名叫隐式原型
// 实例身上的隐式原型,是为了标记当前实例的来源函数的原型对象
函数对象的prototype
函数(Function)是一个特殊的对象,除了和其他对象一样有上述__proto__属性之外,还有自己特有的属性——原型(prototype),这个属性被描述成指针。他指向一个对象类型的数据,这个对象的用途就是包含所有将来使用该函数构造出来的可被共享的属性和方法(我们把这个对象叫做原型对象)。
function createPerson(){
}
console.log(createPerson.prototype);
prototype:专属于函数的一个属性,类型为对象,叫原型对象。
作用:为了给将来自身所在的构造函数被new出来的实例做父级使用的
proto:专属于对象数据的一个属性,类型为对象,叫隐式原型。
作用:找父级。
特性:
1.当某个对象自身不具有某个属性或方法时,会找父级
2.当这个对象是被new出来的实例时,这个对象的父级(proto)就是当前被new的这个构造函数的prototype
意味着:通过构造函数找到prototype,添加的属性或方法,在将来new出来的实例的父级身上都可以找到
构造函数、原型、实例之间的关系
1>构造函数Fn身上有属性prototype为原型对象,原型对象内有constructor属性指向当前prototype所在的构造函数Fn
2>在new执行构造函数Fn时,创造了一个实例对象f,实例对象f的__proto__指向构造函数Fn的原型prototype
3>因为实例对象f的__proto__指向构造函数Fn的原型prototype,所以实例对象f可以间接访问到Fn原型prototype的方法
实例和原型关系检测
function Fn(){}
var f = new Fn();
console.log(f instanceof Fn); //t 查看 f 对象是否是构造函数 Fn 的实例
console.log(f instanceof Object); //t 查看 f 对象是否是构造函数 Fn 的实例
js解析器访问属性顺序:
当访问实例 f 的属性或方法时,会先在当前实例对象 f 中查找,如果没有,则沿着__proto__继续向上寻找,如果找到最顶头的Object还是找不到,则会抛出undefined。如果在实例中找到,或某层原型中找到,就会读取并使用,同时停止向上找寻。
由此可见,解析器的解析顺序遵循就近原则,如果在最近的位置发现属性存在,便不会继续向上找寻。
来源:CSDN
作者:zliqili
链接:https://blog.csdn.net/weixin_46370006/article/details/104909270