有人可以解释为什么我们有这种行为吗?我知道它应该像这样,,但我无法解释
function foo() {}
function foo1() {}
foo.prototype = foo1.prototype = {};
var _foo = new foo();
alert( _foo instanceof foo1 ); // true
答案 0 :(得分:3)
instanceof
运算符检查左侧操作数是否是在其原型链上具有右侧操作数的原型对象的对象。由于两个函数共享相同的原型对象,因此一个实例被视为另一个实例。
答案 1 :(得分: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
原型链循环的子步骤。
答案 2 :(得分:1)
在JavaScript中,使用对象。
如果您将此与更熟悉的对象进行比较,我认为这更容易理解
//defines a "class" Person
function Person() {}
//defines a "class" Animal
function Animal() {}
更改Animal
和Person
原型
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);