捡起JavaScript(3)
原型链
prototype和__proto__之间的关系。
function ABC() {}
var abc = new ABC()
我们知道ABC有个prototype属性,当new出一个新变量abc,其中abc含有__proto__属性,为了区别对待,借鉴大家的普遍认识,其中称prototype为显式原型、__proto__为隐式原型。
有几个概念需要描述一下。
- 隐式原型的对象数据不仅仅只和当前变量绑定,会更改类ABC的显式原型的对象数据。
- 显式原型的改变会影响隐式原型,同样隐式原型也会显式原型。
- 变量abc的隐式原型和ABC的显式原型是等效的。
OK,通过下面代码截图就很能说明问题。
方法调用顺序过程
- 变量属性方法
- __proto__属性方法
- 沿着原型链查找对应的方法
- 都没找到报错
function ABC () {}
var abc = new ABC()
// 显然具有如下的关系
// abc instanceof ABC instanceof Object
abc.say1 = () => {
console.log('say1')
}
ABC.prototype.say2 = () => {
console.log('say2')
}
Object.prototype.say3 = () => {
console.log('say3')
}
abc.say1() // 调用自己的方法
abc.say2() // 查找自己的__proto__方法,即ABC的prototype原型方法
abc.say3() // 沿着原型链查找到Object的prototype原型方法
abc.say4() // 报错,Uncaught TypeError: abc.say4 is not a function
调用属性名,也是如此。。。
心情小记
终于有时间来写写我的JS点滴,工作事太多,最近因为工作原因还在学习Lua和Nginx,以及春哥的Openresty,哎😔。。。