Исправлено свойство конструктора в типичном наследовании - PullRequest
0 голосов
/ 08 апреля 2020

В книге "JavaScript для ниндзя" было предложено следующее исправление для свойства конструктора при создании прототипной цепочки между объектами:

enter image description here

Если я создаю объект Person следующим образом:

var person = new Person();
alert(person.constructor == Ninja); // Display true

Несмотря на то, что он устраняет проблему, что ninja.constructor будет ссылаться на функцию Ninja, но это создает еще одну проблему, которая теперь person.constructor также будет ссылаться на функцию Ninja вместо человека.

Воспроизводимый пример:

function Person() {

}
var person = new Person();
Person.prototype.dance = function() {};

function Ninja() {

}
Ninja.prototype = person;
Object.defineProperty(Ninja.prototype, "constructor", {
  enumerable: false,
  value: Ninja,
  writable: true
})
var ninja = new Ninja();

alert(person.constructor == Ninja); // Display true

Я не могу понять, почему это исправление было предложено автором.

1 Ответ

1 голос
/ 08 апреля 2020

Вы изменяете только свойство constructor этого одного person экземпляра, а не весь класс Person. Если вы сделаете

person2 = new Person();
console.log(person2.constructor == Ninja);

, он напечатает false.

Обратите внимание, что в цитируемой книге он даже не назначил объект new Person() переменной, он просто создал анонимный объект для использования в создании цепочки прототипов.

В общем случае объект, используемый в цепочке прототипов, обычно не используется в качестве фактического объекта в приложении, он просто служит для связывания связанных классы.

function Person() {
}
var person = new Person();
Person.prototype.dance = function() {};

function Ninja() {
}
Ninja.prototype = person;
Object.defineProperty(Ninja.prototype, "constructor", {
  enumerable: false,
  value: Ninja,
  writable: true
})
var ninja = new Ninja();

var person2 = new Person();
console.log(person.constructor == Ninja);
console.log(person2.constructor == Ninja);
...