Javascript继承:原型链如何在本机原型之间工作

问题描述 投票:2回答:3

我们知道Javascript中的所有内容都继承自Object

Inheritance

因此,如果我使用如下所示的构造函数创建对象:

function Rabbit() {
  this.color = 'White'
}

let obj = new Rabbit();

alert(Rabbit.__proto__ === Function.prototype)       //true
alert(obj.__proto__ === Rabbit.prototype)            //true       
alert(obj.__proto__.__proto__ === Object.prototype)  //true

alert(Function.__proto__ === Object.prototype)  //false
alert(Object.getPrototypeOf(Function) === Object.getPrototypeOf(Object))  //true

前三个结果很有意义,因为obj继承自Rabbit函数,该函数本身也继承自Function。但是,如果Function继承自Object,那么为什么是第四个结果False。另外,为什么ObjectFunction都具有相同的原型(最后结果)?

有人可以解释这种行为。我在这里想念什么吗?

javascript function object inheritance prototype
3个回答
2
投票
alert(Object.getPrototypeOf(Function) === Object.getPrototypeOf(Object)) // true

FunctionObject都是函数,它们的原型是Function.prototype。可以通过

验证
Object.getPrototypeOf(Function) === Function.prototype // true
Object.getPrototypeOf(Object) === Function.prototype // true

此对象用于创建Function函数的原型,因此

Function.__proto__ === Function.prototype // true

而不是

Function.__proto__ === Object.prototype // false

alert(Object.getPrototypeOf(Function) === Function.prototype)
alert(Object.getPrototypeOf(Object) === Function.prototype)
alert(Function.__proto__ === Function.prototype)

1
投票

您将函数构造函数的原型Function.__proto__(等效地Object.getPrototypeOf(Function))与函数原型Function.prototype.__proto__混淆。

function Rabbit() {
  this.color = 'White'
}

let obj = new Rabbit();

console.log(Rabbit.__proto__ === Function.prototype)       //true
console.log(obj.__proto__ === Rabbit.prototype)            //true       
console.log(obj.__proto__.__proto__ === Object.prototype)  //true

console.log(Function.prototype.__proto__ === Object.prototype)  //true
console.log(Object.getPrototypeOf(Function.prototype) === Object.getPrototypeOf(Object.prototype))  //false

1
投票

这样的问题最好用图像来解释(就像您的问题):

enter image description here

基本上,Function__proto__ === prototype的唯一对象。

© www.soinside.com 2019 - 2024. All rights reserved.