Подтвердить что ты не робот

Скопировать прототип для наследования?

Я играл с JavaScript, в частности, моделировал объектно-ориентированное программирование с помощью классов и еще чего-то.

Я знал об этом способе достижения наследования

MyClass.prototype = new AnotherClass();

Но я не был удовлетворен, мне не понравилось, как мне нужно было вызвать конструктор AnotherClass. Поэтому я играл, и я придумал что-то, что, казалось, сработало и в основном хотело бы второго мнения.

function clone (obj)
{
    function CloneFactory () {}
    CloneFactory.prototype = obj;

    return new CloneFactory();
}

MyClass.prototype = clone(AnotherClass.prototype);

Клонируя прототип, мы получаем его новую копию и присваиваем этому прототипу MyClass, так что изменение унаследованных свойств не будет влиять на свойства родительского прототипа. Как это было бы MyClass.prototype = AnotherClass.prototype.

Я провел стресс-тесты, и это стало более эффективным при определенных обстоятельствах, т.е. когда в родительском конструкторе много кода, в противном случае это примерно то же самое. Еще одно преимущество (или, по крайней мере, я считаю полезным) заключается в том, что он позволяет в некоторой степени скрывать информацию от подклассов. Любые привилегированные методы и члены НЕ будут унаследованы.

Есть ли какая-то серьезная ошибка, которую я пропускаю?

Я не эксперт с JavaScript, на самом деле я довольно новичок в JavaScript, поэтому мне хотелось бы получить второе мнение по этому поводу, потому что я не могу ничего найти через Google. Я не хочу реализовывать плохой код:)!

4b9b3361

Ответ 1

Это почти то, что делает Object.create. Функция, которую вы написали, является довольно стандартным "polyfill" для этого метода.

Это действительно распространенный способ абстрагирования создания объекта таким образом, который более точно отражает "истинное" прототипное наследование. Определенно безопасный способ сделать что-то.

О, и здесь ссылка на запись MDN для Object.create, если вам интересно: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

Внизу вы заметите, что на самом деле они включают polyfill, который в значительной степени идентичен вашему коду, за исключением некоторых проверок безопасности и имен переменных.