【问题标题】:javascript prototypes and inheritance [duplicate]javascript原型和继承[重复]
【发布时间】:2020-12-28 07:43:55
【问题描述】:

我的问题是对象是原型链上的最后一个对象,所有对象都从它继承属性和方法它是如何从 Function.prototype 继承方法的,为什么 Object.__proto__ === Function.prototype // 是的,为什么 Object.__proto__ 不为空。

【问题讨论】:

  • 没有普通对象继承自 javascript 中的 Object。它们都继承自Object.prototype(也是Object.getPrototypeOf(Function.prototype))。您会发现 Obect.getPrototypeOf(Object.prototype) === null 符合预期。

标签: javascript inheritance prototype


【解决方案1】:

函数也是一个对象。所以它也继承自 Object。

但不要被Object.__proto__ 弄糊涂了。这是浏览器添加的内容,实际上并不是语言的一部分。所以不要依赖它或使用它。

基本上,Function.prototypeObject.__proto__

【讨论】:

  • 为什么函数不是原型链的最后一个?
  • 因为 Function 继承自 Object。
  • 不,Object 继承自 Function,它是作为本机代码实现的。这就是对象能够使用new 关键字作为构造函数调用的方式/原因。打开浏览器控制台并输入:Function.prototype; 看看你会得到什么。
  • @ScottMarcus Geuis 的意思是 Function 是 Object 的子类,所有的函数都是对象。不,Object 不继承自 Function。充其量,它确实继承自 Function.prototype,它是一个 instanceof Function
  • @ScottMarcus riiight。有点生疏了,我已经下班几个月了。对不起。是的,Object 确实继承自 Function,这就是为什么您可以使用 new Function()new Object()。但是@Bergi 正在澄清我最初想说的话。
【解决方案2】:

JavaScript 中的基本 Object 必须有一种方法可以对其进行实例化,因此它需要一个 prototype 对象来辅助如下行:

let myObj = new Object();

这就是为什么Object.__proto__ 不是null

Function object 是一种特殊类型的对象,它通过构造函数促进对象实例化,当以这种方式使用时,称为“构造函数”。因此,Object 继承自 Function 对象是有意义的,以便可以创建对象实例。

【讨论】:

  • 它的意思是Function和Object互相继承方法和属性?
  • 为什么函数不是原型链的最后一个?
  • @javascriptlover Function 是原型链的最后一个。正如您正确指出的那样Object._proto__ === Function()
  • mdn 说 Object 在原型链上是最后一个。
  • 我认为您混淆了__proto__prototype__proto__ 是在查找链中用于解析方法等的实际对象。prototype 是在您使用 new 创建对象时用于构建 __proto__ 的对象
猜你喜欢
  • 2019-01-24
  • 2016-07-04
  • 2016-11-19
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多