写出代码的执行结果
var F = function(){};
Object.prototype.a = function(){
console.log('123');
};
Function.prototype.b = function(){
console.log('456');
}
var f = new F();
F.a();
F.b();
f.a();
f.b();
答案:
123
456
123
报错:Uncaught TypeError: f.b is not a function
解析:
1、F.a();F.b();
F 是个构造函数,而 F 是构造函数 Function 的一个实例。因为 F instanceof Object === true 、F instanceof Function === true,由此我们可以得出结论:F 是 Object 和 Function 两个的实例,即 F 能访问到 a, 也能访问到 b。所以 F.a() 输出 123 ,F.b() 输出 456。
2、f.a();f.b();
对于 f ,我们先来看一下下面的结果:
f 并不是 Function 的实例,因为它本来就不是构造函数,调用的是 Function 原型链上的相关属性和方法了,只能访问到 Object 原型链。所以 f.a() 输出 123 ,而 f.b() 就报错了。
3、分析查找路径
1> F.a 的查找路径:F 自身:没有 ---> F.__proto__(Function.prototype):没有---> F.__proto__.__proto__(Object.prototype):找到了输出 123
2> F.b 的查找路径:F 自身:没有 ---> F.prototype(Function.prototype):456
3> f.a 的查找路径:f 自身:没有 ---> f.__proto__(Object.prototype):输出 123
4> f.b 的查找路径:f 自身:没有 ---> f.__proto__(Object.prototype):没有 ---> f.__proto__.__proto__(Object.prototype.__proto__:null):找不到,报错