Почему Node.js наследуют реализованный ObjectSetPrototypeOf (A.prototype, B.prototype); и ObjectSetPrototypeOf (A, B); - PullRequest
1 голос
/ 03 мая 2020

Я нахожу Node.js реализовать наследование таким образом, например: https://github.com/nodejs/node/blob/master/lib/_http_server.js

ObjectSetPrototypeOf(ServerResponse.prototype, OutgoingMessage.prototype);   // line 174
ObjectSetPrototypeOf(ServerResponse, OutgoingMessage);  // line 175

вместо установки только прототипа:

ObjectSetPrototypeOf(ServerResponse.prototype, OutgoingMessage.prototype);

1 Ответ

0 голосов
/ 03 мая 2020

Так что методы stati c родительского класса наследуются подклассом, потому что они сделали конструктор родительского класса прототипом конструктора дочернего класса.

Собственный синтаксис class делает то же самое:

class Parent {
    static example() {
        console.log("Parent.example");
    }
}

class Child extends Parent {
}

console.log(Child.example());                 // "Parent.example"
console.log(Child.hasOwnProperty("example")); // false
console.log("example" in Child);              // true, because it's inherited
console.log(Object.getPrototypeOf(Child) === Parent); // true

Помните, что функции - это объекты. Объекты могут иметь прототипы. Объект наследует свойства от своего прототипа. В приведенном выше примере Child (объекты функций) имеет Parent (объект функции) в качестве прототипа, поэтому он наследует свойство example. До ES5 у функции, созданной с кодом JavaScript, всегда был Function.prototype в качестве прототипа, но, начиная с ES2015, это не всегда так. Синтаксис class делает конструктор суперкласса прототипом конструктора подкласса. Вы также можете изменить прототип функции после ее создания с помощью Object.setPrototypeOf, но обычно лучше избегать изменения прототипа существующего объекта.

В главе 4 моей новой книги JavaScript: Новые игрушки , я использую следующий пример, чтобы проиллюстрировать эту концепцию (детали опущены):

class Color {
}
class ColorWithAlpha {
}

вместе с этой диаграммой, чтобы показать две параллельные цепи прототипов, созданные этим, одну для Сами функции конструктора и другие для объектов, которые они назначают в качестве прототипа при использовании для создания объектов:

enter image description here

...