2013-06-28 5 views
3

Есть ли разница между следующими частями кода:Javascript проверки прототип объекта

inst instanceof Constr 

и

inst.__proto__ === Constr.prototype 

, например:

var xyz = {} 
xyz instanceof Object 

и

xyz.__proto__ === Object.prototype 

? Если да, то в чем разница, какая из них предпочтительнее?

ответ

4

__proto__ не является частью спецификации ECMAScript 5, и у вас нет гарантий на будущую поддержку. Стандартные способы доступа к прототипу объекта - это доступ к прототипу конструктора или, лучше, Object.getPrototypeOf (но это не работает на IE8).

instanceof проверяет прототип конструктора, а также «проверяет наличие конструктора.прототипа в цепочке прототипов объекта»..

Если ваша цель - проверить, является ли объект экземпляром определенного класса, и это нормально для вас, если это не прямой экземпляр, вам следует использовать оператор instanceof: это действительно сделано для этого.

1

InstanceOf проверяет дальнейшее

var GrandParent=function(){}; 
var Parent = function(){} 
Parent.prototype=new GrandParent() 
var Child = function(){}; 
Child.prototype=new Parent() 

var c=new Child(); 
console.log(c instanceof GrandParent);//true 
console.log(c.__proto__ === GrandParent);//false 
1

Там на самом деле третий путь, который выглядит очень похоже на нестандартные __proto__ примеры:

Object.getPrototypeOf([]) === Array.prototype 

устанут:

console.log([] instanceof Object);//ture 
console.log(Object.getPrototypeOf([]) === Object.prototype);//false 

В основном, оператор instanceof проверяет всю цепочку прототипов, другой метод s не

2

Существует два отличия. Как уже упоминалось ранее, instanceof является рекурсивным. Вы можете реализовать свою собственную версию instanceof следующим образом:

function instanceOf(obj, func) { 
    return Object.isPrototypeOf.call(func.prototype, obj); 
} 

Эта функция зависит от наличия функции Object.prototype.isPrototypeOf.

Второе отличие - это только для браузеров. Как уже упоминалось в following answer фактическая реализация instanceof выглядит следующим образом в браузерах:

function instanceOf(obj, func) { 
    var prototype = func.prototype; 

    while (obj = Object.getPrototypeOf(obj)) { //traverse the prototype chain 
     if (typeof object === "xml")   //workaround for XML objects 
      return prototype === XML.prototype; 
     if (obj === prototype) return true; //object is instanceof constructor 
    } 

    return false; //object is not instanceof constructor 
} 

Вот и все. Для получения более подробной информации смотрите документацию instanceof: https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model#Determining_instance_relationships

+0

По «фактической реализации в браузерах» Вы в очередной раз означает абстрактный псевдокод, что никакой фактической реализации не будет использовать в самом деле его реализации: P – Esailija

+0

@Esailija Я бы на самом деле беспокоить, глядя вверх по код для 'instanceof' в двигателе V8, не так ли? = Р –