2016-03-15 258 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() {} 

變化AnimalPerson原型

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

instanceof運營商檢查是否左邊的操作數是在其原型鏈的原型對象的對象右手操作數。由於你的兩個函數共享同一個原型對象,所以一個實例被視爲另一個的實例。

1

o instanceof f檢查f.prototype引用的對象是否出現在原型鏈o的任何地方。在你的情況下,因爲foo.prototypefoo1.prototype都涉及同一個對象,所以通過new foonew foo1創建的任何對象都將爲instanceoffoofoo1

這是覆蓋在規範的以下部分:Runtime Semantics: InstanceofOperator(O, C)Function.prototype[@@hasInstance] (V)OrdinaryHasInstance (C, O),大部分工作在最後一個環節正在做,步驟4到7(7具有通過o的原型爲循環分步驟鏈)。