当第一次遇到instanceof时,JavaScript中的JavaScript关键字可能会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言。
发布于 2010-03-15 17:52:03
实例数
左手侧(LHS)操作数是被测试到右侧(RHS)操作数的实际对象,RHS操作数是类的实际构造函数。基本定义是:
检查当前对象,如果对象是指定的对象类型,则返回true。
下面是一些好例子,下面是直接从Mozilla的开发人员站点获取的一个例子
var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral"; //no type specified
color2 instanceof String; // returns false (color2 is not a String object)值得一提的是,如果对象继承自类的原型,则instanceof计算结果为true:
var p = new Person("Jon");
p instanceof Person这是p instanceof Person,因为p是从Person.prototype继承的。
根据任择议定书的要求
我添加了一个小示例,并给出了一些示例代码和说明。
当您声明一个变量时,就给它一个特定的类型。
例如:
int i;
float f;
Customer c;上面向您展示了一些变量,即i、f和c。这些类型是integer、float和用户定义的Customer数据类型。像上面这样的类型可以用于任何语言,而不仅仅是JavaScript。但是,在JavaScript中,当您声明一个变量时,您没有显式地定义一个类型,var x,x可以是一个数字/字符串/用户定义的数据类型。因此,instanceof所做的是检查对象,看看它是否属于指定的类型,因此从上面取下Customer对象,我们可以这样做:
var c = new Customer();
c instanceof Customer; //Returns true as c is just a customer
c instanceof String; //Returns false as c is not a string, it's a customer silly!上面我们已经看到c是用Customer类型声明的。我们对它做了新的修改,并检查了它是否是Customer型的。当然,它返回的是真。然后仍然使用Customer对象来检查它是否是String。不,绝对不是String --我们更新了一个Customer对象,而不是一个String对象。在这种情况下,它返回false。
真的很简单!
发布于 2011-06-30 15:56:59
到目前为止,任何评论似乎都没有涉及到其中一个重要的方面:继承。由于原型继承,通过使用instanceof计算的变量可以返回多个“类型”的true。
例如,让我们定义一个类型和一个子类型:
function Foo(){ //a Foo constructor
//assign some props
return this;
}
function SubFoo(){ //a SubFoo constructor
Foo.call( this ); //inherit static props
//assign some new props
return this;
}
SubFoo.prototype = Object.create(Foo.prototype); // Inherit prototype
SubFoo.prototype.constructor = SubFoo;现在我们有了几个“类”,让我们创建一些实例,并找出它们是哪些实例:
var
foo = new Foo()
, subfoo = new SubFoo()
;
alert(
"Q: Is foo an instance of Foo? "
+ "A: " + ( foo instanceof Foo )
); // -> true
alert(
"Q: Is foo an instance of SubFoo? "
+ "A: " + ( foo instanceof SubFoo )
); // -> false
alert(
"Q: Is subfoo an instance of Foo? "
+ "A: " + ( subfoo instanceof Foo )
); // -> true
alert(
"Q: Is subfoo an instance of SubFoo? "
+ "A: " + ( subfoo instanceof SubFoo )
); // -> true
alert(
"Q: Is subfoo an instance of Object? "
+ "A: " + ( subfoo instanceof Object )
); // -> true看到最后一行了吗?所有对函数的“新”调用都返回继承自对象的对象。即使使用对象创建速记,这也是正确的:
alert(
"Q: Is {} an instance of Object? "
+ "A: " + ( {} instanceof Object )
); // -> true那么“类”定义本身又如何呢?他们的例子是什么?
alert(
"Q: Is Foo an instance of Object? "
+ "A:" + ( Foo instanceof Object)
); // -> true
alert(
"Q: Is Foo an instance of Function? "
+ "A:" + ( Foo instanceof Function)
); // -> true我认为理解任何对象都可以是多个类型的实例是很重要的,因为您可以(错误地)假设您可以通过使用instanceof来区分对象和函数。正如最后一个例子清楚地显示的那样,函数是一个对象。
如果您正在使用任何继承模式,并且希望通过鸭类型以外的方法来确认对象的后代,这一点也很重要。
希望这对探索instanceof的人有帮助。
发布于 2012-02-09 23:04:33
这里的其他答案是正确的,但它们没有深入了解instanceof的实际工作方式,这可能会引起一些语言律师的兴趣。
JavaScript中的每个对象都有一个原型,可以通过__proto__属性访问。函数还有一个prototype属性,它是它们创建的任何对象的初始__proto__。在创建函数时,将为prototype提供一个唯一的对象。instanceof运算符使用此唯一性给您一个答案。如果您将instanceof作为一个函数编写,下面是它的样子。
function instance_of(V, F) {
var O = F.prototype;
V = V.__proto__;
while (true) {
if (V === null)
return false;
if (O === V)
return true;
V = V.__proto__;
}
}这基本上是翻译ECMA-262版5.1 (也称为ES5),第15.3.5.3节.
注意,您可以将任何对象重新分配到函数的prototype属性,也可以在构造对象的__proto__属性之后重新分配它。这将给你一些有趣的结果:
function F() { }
function G() { }
var p = {};
F.prototype = p;
G.prototype = p;
var f = new F();
var g = new G();
f instanceof F; // returns true
f instanceof G; // returns true
g instanceof F; // returns true
g instanceof G; // returns true
F.prototype = {};
f instanceof F; // returns false
g.__proto__ = {};
g instanceof G; // returns falsehttps://stackoverflow.com/questions/2449254
复制相似问题