2016-03-15 3 views
1

Может кто-нибудь объяснить, почему у нас такое поведение? Я понимаю, что он должен действовать, как это, , но я не могу объяснитьНаследование Js и instanceof

function foo() {} 

function foo1() {} 

foo.prototype = foo1.prototype = {}; 

var _foo = new foo(); 

alert(_foo instanceof foo1); // true 

ответ

1

В JavaScript, работа с объектами.

Я думаю, что легче понять, если вы сравните это с более привычными объектами

//defines a "class" Person 
function Person() {} 

//defines a "class" Animal 
function Animal() {} 

Изменение Animal и Person прототип

Person.prototype = Animal.prototype = {}; 

прототип может быть использован для расширения «класс», пример

function Person(name){ 
    this.name=name; 
} 

Person.prototype.nameInUperCase=function(){ 
    return this.name.toUpperCase(); 
} 

Оформить заказ

var myPerson = new Person(); 

Проверьте, если у меня есть экземпляр.

// true because you instantiate the same prototype 
// remember Person.prototype = Animal.prototype = {}; 
alert(myPerson instanceof Animal); 
3

The instanceof проверки оператора, чтобы увидеть, если левый операнд является объектом, который имеет на своей цепочке прототипов прототип объекта из правый операнд. Поскольку обе ваши функции имеют один и тот же объект-прототип, экземпляр одного из них считается экземпляром другого.

1

o instanceof f проверяет, существует ли объект, на который ссылается f.prototype, в цепочке прототипов o. В вашем случае, так как оба foo.prototype и foo1.prototype относятся к тому же объекту, любой объект, созданный через new foo или new foo1, будет instanceof и foo и foo1.

Это описано в следующих разделах спецификации: Runtime Semantics: InstanceofOperator(O, C), Function.prototype[@@hasInstance] (V) и OrdinaryHasInstance (C, O), причем большая часть работы, проводимой в этой последней ссылке, шаги с 4 по 7 (7 имеет подэтапы для петли через o «s прототип цепь).

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