Я хотел прокомментировать этот старый вопрос, но, похоже, он заблокирован.
Вот мой вариант использования:
- Объект
obj
создается с помощью конструктораBase
.obj instanceof Base
возвращает истину. - I want to change the prototype of
obj
such that it appears as ifobj
was constructed fromDerived
. That is, I wantobj
to get access to the methods ofDerived
obj instanceof Derived
, чтобы вернуть истину
Причина в том, что obj
должен иметь тип в иерархии, который неизвестен во время его создания и определяется тем, что происходит после. Я хочу иметь возможность перемещать его вниз по иерархии.
Я верю, что могу сделать это с
obj.__proto__ = Derived.prototype;
но __proto__
будет объявлено устаревшим в следующей версии JavaScript. API прокси, который изменился с тех пор, как вопрос, на который я ссылался выше, был спросил, похоже, не поддерживает мой вариант использования.
Существует ли альтернативная реализация для моего варианта использования, существующая сейчас или планируемая в будущем?
Единственная альтернатива, которую я вижу прямо сейчас, - это использовать
obj2 = Object.create(Derived.prototype);
obj2.extend(obj);
и никогда не храните более одной ссылки на obj, но такая стоимость довольно неудобна.
Вот скрипка, демонстрирующая проблему.
__proto__
уже устарел. Вы можете изменить[[Prototype]]
объекта только при его создании, вы не можете изменить цепочку впоследствии. - person RobG   schedule 28.03.2012