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

发布于 2022-09-12 03:52:39 字数 233 浏览 25 评论 0

题目描述

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不离久伴 2022-09-19 03:52:40

你搞错状况了

  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
梦幻的味道 2022-09-19 03:52:40

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

究竟谁懂我的在乎 2022-09-19 03:52:39

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

﹂绝世的画 2022-09-19 03:52:39
//第一步
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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文