Наследование Javascript: как цепочка прототипов работает между нативными прототипами - PullRequest
3 голосов
/ 19 октября 2019

Как мы знаем, все в 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

Первые 3 результата имеют смысл, поскольку obj наследует функцию Rabbit, которая сама наследуется от Function. Но если Function наследует от Object, то почему 4-й результат False. Кроме того, почему у Object и Function один и тот же прототип (последний результат)?

Может кто-нибудь объяснить это поведение. Я что-то здесь упускаю?

Ответы [ 3 ]

3 голосов
/ 19 октября 2019
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)
1 голос
/ 19 октября 2019

Подобные проблемы лучше объяснить с помощью изображений (например, вопроса):

enter image description here

Legend:

   blue color = objects
   {} = simple object (+constructor name)
   Ⓟ = prototype object (+constructor name)

   magenta color = functions (ƒ + function name)

По существу, __proto__Цепочка для функций:

concrete function (e.g. Rabbit, Object or Function itself) 
-> abstract function (aka Function.prototype) 
-> Object.prototype 
-> null 
1 голос
/ 19 октября 2019

Вы путаете 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
...