JavaScript isPrototypeOf vs instanceof use
Предположим, что мы имеем:
function Super() {
// init code
}
function Sub() {
Super.call(this);
// other init code
}
Sub.prototype = new Super();
var sub = new Sub();
Затем в какой-то другой части нашего ocde мы можем использовать одно из следующих условий для проверки отношения:
sub instanceof Super;
или
Super.prototype.isPrototypeOf( sub )
В любом случае нам нужно иметь как объект (sub), так и родительский конструктор (Super). Итак, есть ли какая-то причина, по которой вы бы использовали один против другого? Есть ли какая-то другая ситуация, где различие более ясно?
Я уже внимательно прочитал 2464426, но не нашел достаточно конкретного ответа.
Ответы
Ответ 1
Представьте, что вы не используете конструкторы в своем коде, но вместо этого используйте Object.create
для создания объектов с определенным прототипом. Ваша программа может быть заархивирована, чтобы вообще не использовать конструкторы:
var superProto = {
// some super properties
}
var subProto = Object.create(superProto);
subProto.someProp = 5;
var sub = Object.create(subProto);
console.log(superProto.isPrototypeOf(sub)); // true
console.log(sub instanceof superProto); // TypeError
Здесь у вас нет функции-конструктора для использования с instanceof
. Вы можете использовать только subProto.isPrototypeOf(sub)
.
Ответ 2
Это мало влияет на использование функций-конструкторов. instanceof
немного чище, возможно. Но когда вы не...:
var human = {mortal: true}
var socrates = Object.create(human);
human.isPrototypeOf(socrates); //=> true
socrates instanceof human; //=> ERROR!
Итак, isPrototypeOf
является более общим.
Ответ 3
var neuesArray = Object.create(Array);
Array.isPrototypeOf(neuesArray); // true
neuesArray instanceof Array // false
neuesArray instanceof Object // true
Array.isArray(neuesArray); // false
Array.prototype.isPrototypeOf(neuesArray); // false
Object.prototype.isPrototypeOf(neuesArray); // true
Вы понимаете моего друга:) - просто