Javascript继承:原型链如何在本机原型之间工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript继承:原型链如何在本机原型之间工作相关的知识,希望对你有一定的参考价值。
我们知道javascript中的所有内容都继承自Object
:
因此,如果我使用如下所示的构造函数创建对象:
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
。另外,为什么Object
和Function
都具有相同的原型(最后结果)?
有人可以解释这种行为。我在这里想念什么吗?
答案
alert(Object.getPrototypeOf(Function) === Object.getPrototypeOf(Object)) // true
Function
和Object
都是函数,它们的原型是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)
另一答案
您将函数构造函数的原型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
另一答案
这样的问题最好用图像来解释(就像您的问题):
基本上,Function
是__proto__
=== prototype
的唯一对象。
以上是关于Javascript继承:原型链如何在本机原型之间工作的主要内容,如果未能解决你的问题,请参考以下文章