2013-08-20 7 views
24

Предположим, что мы имеем следующее:JavaScript isPrototypeOf против использования InstanceOf

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) 

в любом случае, нам нужно иметь как объект (суб), и родительский конструктор (супер). Итак, есть ли какая-то причина, по которой вы бы использовали один против другого? Есть ли какая-то другая ситуация, когда различие более ясно?

Я уже внимательно прочитал 2464426, но не нашел достаточно конкретного ответа.

+0

возможно дубликат [? Почему нам нужно isPrototypeOf вообще] (http://stackoverflow.com/questions/5972991/why-do -we-need-the-isprototypeof-at-all) – plalx

+0

Основываясь на комментарии OP, я бы сказал, что этот вопрос ближе к «Зачем нам вообще нужно« instanceof »? но я согласен, что это, вероятно, достаточно близко. – apsillers

ответ

27

Представьте, что вы не используете в своем коде конструкторы, но вместо этого используйте 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).

+1

Спасибо за ответ, и у меня есть одно быстрое наблюдение: зачем нам нужен экземпляр, так как isPrototypeOf будет работать во всех случаях? Является ли это историческим или есть преимущества в производительности, или что-то еще? – user1689498

+0

@ user1689498 Просто потому, что 'isPrototypeOf' был реализован позже. – plalx

+2

@ user1689498: 'instanceof' старше, я считаю, и похож на Java, что было очень важно, когда JavaScript был впервые представлен. Это также немного чище. Но да, 'isPrototypeOf' является более общедоступным. –

7

Это не имеет особого значения при использовании функций-конструкторов. instanceof немного чище, возможно. Но когда вы не ...:

var human = {mortal: true} 
var socrates = Object.create(human); 
human.isPrototypeOf(socrates); //=> true 
socrates instanceof human; //=> ERROR! 

So isPrototypeOf более общий.

+1

Отлично! :) Но одно. «Человек» в этом примере должен быть «Человеком». Я имею в виду, что это должен быть класс (Все люди), а не один экземпляр (человек). –

+0

@NaeelMaqsudov: Остерегайтесь аналогии между языками. У Javascript нет классов. Даже когда в ES6 добавлена ​​пародия на синтаксический сахар 'class', язык все равно не будет иметь что-то действительно похожее, скажем, на классы Java. Прототипное наследование имеет некоторые параллели с классическим наследованием, но аналогии - грубые. В любом случае выполнения наследования будет существовать такой объект - возможно, прототип функции-конструктора. Но обратите внимание: 'var naeel = Object.create (человек); naeel instanceof человека; // => true'. Это отбрасывает часть сахара функций-конструкторов. –

+0

Извините, плохая ошибка вырезания и вставки. 'наивный экземпляр человека; // => ERROR.' Но 'human.prototypOf (naeel); // => true'. –

0
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 

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

+0

Я не уверен, что вы пытаетесь передать и как это имеет отношение к проблеме. Можете ли вы добавить объяснение этому? – Unihedron

+0

Разница «instanceof» - оператор и Object.isPrototypeOf() - метод - или? – svenskanda

Смежные вопросы