实例化对象时,Function和Object的疑惑

Melon
  • 3
新手上路,请多包涵

题目描述

今天研究原型链时,发现 f1 对象里面 __porto__ 存在 a 方法,不存在 b 方法,并且 arr 对象里面同样存在 a 方法,这就让我很疑惑 new 操作符到底是怎么将 Object 挂上去的,麻烦各位前辈解答下🙇‍

相关代码

var F = new Function();
Object.prototype.a = function () {
  console.log("aaa");
}
Function.prototype.b = function () {
  console.log("bbb");
}
var f1 = new F();
console.log(f1);

var arr = new Array();
console.log(arr);
回复
阅读 1.1k
4 个回答

f1F 的实例,所以 f1.__proto__ === F.prototype。而原型对象也是对象,构造函数为 Object,所以 F.prototype.__proto__ === Object.prototype。于是 f1 的原型链上(图中蓝色线)也就有 a 方法。至于 Function.prototype,这是函数 F 原型链上(红色线)的(它既可以访问到 a 也可以访问到 b 方法)。
image.png

//第一步
var F = new Function();
//此时 F.__proto__ === Function.prototype
//另外会生成一个F.prototype,F.prototype继承于Object.prototype

//第二步,没什么需要解释的
Object.prototype.a = function () {
  console.log("aaa");
}
Function.prototype.b = function () {
  console.log("bbb");
}

//第三步
var f1 = new F();
//此时 f1.__proto__ === F.prototype
//F.prototype继承于Object.prototype,所以有a
//b在Function.prototype上,通过F.__proto__可以找到,但是通过F.prototype找不到的
console.log(f1);

//第四步 Array同理Function
var arr = new Array();
//此时 arr.__proto__ === Array.prototype
//Array.prototype.__proto__ === Object.prototype
//也就是
//arr.__proto__.__proto__ === Object.prototype
console.log(arr);

你搞错状况了

  1. F才是正统的Function的实例, 所以F.__proto__ = Function.prototype;
  2. 因为functin 和Object都是最终都 instanceof Object 所以都可以访问到a
  3. new F(); 是把F当作构造函数使用了,它的返回值是一个对象,所以 f.__proto__ === Object.prototype, 所以f压根就谈不上继承了Function,或者是Function的实例,所以原型链上就没有Function 自然就拿不到b

1.png

第一问
console.log(f1); 根据原型链可以找到:

f1.__proto__=>F.prototype 在这上面的原型链=>F.prototype.__proto__=>Object.prototype=>那么就能看见方法a

原型链指向的是所属类的原型
fF的实例,f.__protot__指向的就是F.prototype这个原型了

第二问
console.log(arr); 根据原型链可以找到
arr.__proto__=>Array.prototype这上面的原型链=>Array.prototype.__proto__=>Object.prototype=>那么就可以看见方法a

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏