Оператор instanceof просто проверяет, находится ли общедоступное свойство конструктора prototype
в цепочке [[Prototype]]
объекта. Один из способов разорвать цепь - изменить прототип конструктора:
function Base() {}
var base = new Base();
alert( base instanceof Base); // true
Base.prototype = {};
alert( base instanceof Base); // false
alert( base instanceof Object); // true
Второе предупреждение является ложным, потому что новый Base.prototype
больше не находится в цепочке [[Prototype]]
из base
(хотя исходное еще есть). Обратите внимание, что Object.protoyype
все еще есть. Вышесказанное является одной из причин, почему оператор instanceof
не считается особенно полезным.
Чтобы сделать то, что вы пытаетесь сделать, вы должны создать цепочку [[Prototype]]
при создании объекта, потому что вы не можете изменить его позже:
Derived.prototype = new Base();
var base = new Derived();
alert(base instanceof Base); // true
alert(base instanceof Derived); // true
Редактировать
Требования были:
- Объект obj создается с помощью конструктора Base. obj instanceof Base возвращает true.
Как показано, это не обязательно так. Если у вас есть стратегия, которая зависит от instanceof
возврата определенного значения, тогда вы накладываете (вероятно, неразумное) ограничение на дизайн без какой-либо явной выгоды.
2
. Я хочу изменить прототип obj так, чтобы он выглядел так, как будто объект obj был создан из Derived. То есть я хочу
• obj для получения доступа к методам Derived
Вы можете сделать это, сделав Base.prototype экземпляром Derived (как показано) или скопировав свойства в Base.prototype.
• obj instanceof Derived для возврата true
Вы можете сделать это, сделав Base.prototype
экземпляр Производный до , создав любые экземпляры Base .
Вы не можете изменить цепочку после создания экземпляра. Если вы отбросите ограничение instanceof
, вы можете добавить методы Derived.prototype
, просто скопировав их в Base.prototype
. Другой способ - использовать call или apply :
Derived.prototype.someMethod.call(base, ...);
но я подозреваю, что вы пытаетесь сделать что-то, что невозможно.