Function.prototype.a = () => alert(1)
Object.prototype.b = () => alert(2)
function A(){}
const a = new A()
a.a()
a.b()
new的过程可以拆解成以下三步:
- const a = {}
- a.__proto__ = A.prototype
- A.call(a)
每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。
那么当我们调用 a.a 或者 a.b 时,首先 a 中没有 a 或者 b 这个属性, 于是,他就需要到他的__proto__中去找,也就是A.prototype,由于A.prototype中也没有 a 或者 b ;那就去 a.__proto__.__proto__ (A.prototype.__proto__)找,也就是Object.prototype中去找,于是就找到了b这个属性。a属性仍然没找到,继续去Object.prototype.__proto__中找,Object.prototype.__proto__ ==null,所以没找到a属性。
所以a可以拿到b方法,拿不到a方法, a.a()直接报错。

网友评论