• 3
  • 新人请关照

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

题目描述

今天研究原型链时,发现 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);
阅读 335
评论
    4 个回答

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

      • 12.5k
      //第一步
      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
          • 214

          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

            撰写回答

            登录后参与交流、获取后续更新提醒

            相似问题
            推荐文章