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

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, но не нашел достаточно конкретного ответа.

4b9b3361

Ответ 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

Вы понимаете моего друга:) - просто