Function.prototype.a = () => { console.log(1); } Object.prototype.b = () => { console.log(2); } function A() {} const a = new A(); a.a(); a.b(); A.a()
笔者第一反应就懵逼,搞不懂特地放一个 Function.prototype.a
干什么,由于 function A
的原型链属性 prototype 只和 Object
有关系,和 Function
对象自己没啥关系。面试
面试中笔者猜想函数
a.a() // 会没法执行,由于 A 的原型的原型,我知道是 Object 而非 Function。 a.b() // 正常打印 2,由于 Object 的原型被加上了 b 方法,顺着原型链能被找获得。 A.a() // 第一反应和 a.a() 没有区别,由于顺着原型链仍是只能找到 Object。可是面试官特地放上来这个,就让笔者疑神疑鬼的。
最后面试完,特地去输出了下结果.net
a.a() // Uncaught TypeError: a.a is not a function a.b() // 2 A.a() // 1 A.b() // 2
也就是说 A 能够找到 Function.prototype 和 Object.prototype 的属性。而 a 只能找到 Object.prototype 的。prototype
嗯,这个 A 挺让人困惑的。code
A instanceof Object // true A instanceof Function // true a instanceof A // true a instanceof Object // true a instanceof Function // false
对于 new 出来的对象 a 的属性,原型链查找的顺序应该是对象
a.__proto__
至关于 A.prototypeA.prototype.__proto__
至关于 Object.prototypeObject.prototype.__proto__
这个为 null,原型链查找到头。对于 function 定义的函数 A 的属性,原型链查找顺序应该是blog
A.__proto__
至关于 Function.prototypeFunction.prototype.__proto__
等于 Object.prototypeObject.prototype.__proto__
这个为 null,原型链查找到头。总之几点原则:原型链
__proto__
都指向 Object.prototype (除了 Object.prototype 自身)Object.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
这篇对 Object 和 Function 的关系讲得很好,能够参考。get