实例化对象时,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);

回答

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

以上是 实例化对象时,Function和Object的疑惑 的全部内容, 来源链接: utcz.com/a/35078.html

回到顶部