前一篇章讲了原型链继承,那原型链怎么理解呢,是时候来讲一下了:
我们查找一个实例对象的属性或方法,首先会在自己的实例属性或方法中查找,找到这个属性或方法,那么这属于私有属性或方法;如果没有则根据指针链(__proto__
)到当前实例所属类型的原型对象上找,找到这个属性或方法,那么这个属性或方法属于公有属性或方法,若还没有,则继续通过指针链(__proto__
)往上找,一直找到Object.prototype上还没有则说明这个对象是没有原型对象的
function Fn(){
this.x = 100;
}
Fn.prototype.showX = function () {
console.log(this.x)
}
var fn = new Fn();
console.log(fn)
原型链在控制台展示这样的:
下面是一张原型链的草图:
原型链.jpg
所谓原型链只得就是图中
__proto__
这一条指针链,而原型链的顶端就是Object.__proto__
每个对象都有
__proto__
属性,Object
对象除外;每个构造函数都有一个名为
prototype
的原型对象,这个原型对象同样带有__proto__
属性;每个对象的
__proto__
属性都指向自身构造函数的prototype
原型对象。isPrototypeOf()
可以用来判断对象object1
是否存在于对象object2
的原型链中,是则返回true
,不是返回false
function Fn(){
this.x = 100;
}
Fn.prototype.showX = function () {
console.log(this.x)
}
var fn = new Fn();
console.log(Fn.prototype.isPrototypeOf(fn)); //true
如果 object2 的原型链中包含object1,那么 isPrototypeOf 方法返回 true。
如果 object2 不是一个对象或者 object1 没有出现在 object2 中的原型链中,isPrototypeOf 方法将返回false。
需要注意的指向是
Function.prototype的proto指向其构造函数Object的prototype;
Object.prototype的prototype指向null(尽头)
console.log(Function.prototype.isPrototypeOf(Object)); //true
console.log(Object.prototype.isPrototypeOf(Function)); //true
console.log(Object.prototype.__proto__); //null
console.log(Function.prototype.__proto__)
附上一张完整的原型链图:
完整原型链图.jpg
网友评论