Js继承和instanceof

时间:2016-03-15 13:55:25

标签: javascript

有人可以解释为什么我们有这种行为吗?我知道它应该像这样,,但我无法解释

function foo() {}

function foo1() {}

foo.prototype = foo1.prototype = {};

var _foo = new foo();

alert( _foo instanceof foo1 ); // true

3 个答案:

答案 0 :(得分:3)

instanceof运算符检查左侧操作数是否是在其原型链上具有右侧操作数的原型对象的对象。由于两个函数共享相同的原型对象,因此一个实例被视为另一个实例。

答案 1 :(得分:1)

o instanceof f检查f.prototype引用的对象是否出现在o的原型链中的任何位置。在您的情况下,由于foo.prototypefoo1.prototype都引用同一个对象,因此通过new foonew foo1创建的任何对象都将instanceof foo }和foo1

规范的以下部分涵盖了这一点:Runtime Semantics: InstanceofOperator(O, C)Function.prototype[@@hasInstance] ( V )OrdinaryHasInstance (C, O),大部分工作都是在最后一个链接中完成的,步骤4到7( 7有通过o原型链循环的子步骤。

答案 2 :(得分:1)

在JavaScript中,使用对象。

如果您将此与更熟悉的对象进行比较,我认为这更容易理解

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

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

更改AnimalPerson原型

Person.prototype = Animal.prototype = {};

原型可用于扩展" class",示例

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);