第一次遇到JavaScript中的instanceof关键字时,可能会让人非常困惑,因为人们倾向于认为JavaScript不是面向对象的编程语言。
是什么? 它能解决什么问题? 什么时候合适,什么时候不合适?
第一次遇到JavaScript中的instanceof关键字时,可能会让人非常困惑,因为人们倾向于认为JavaScript不是面向对象的编程语言。
是什么? 它能解决什么问题? 什么时候合适,什么时候不合适?
当前回答
//Vehicle is a function. But by naming conventions
//(first letter is uppercase), it is also an object
//constructor function ("class").
function Vehicle(numWheels) {
this.numWheels = numWheels;
}
//We can create new instances and check their types.
myRoadster = new Vehicle(4);
alert(myRoadster instanceof Vehicle);
其他回答
运算符
左手边(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。
根据指挥官的要求
I've added a small example with some sample code and an explanation.当你声明一个变量时,你给它一个特定的类型。
例如:
int i;
float f;
Customer c;
上面显示了一些变量,即i, f和c。类型是整数,浮点数和用户定义的客户数据类型。像上面这样的类型可以适用于任何语言,而不仅仅是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类型声明的。我们已经更新了,并检查了是否为客户类型。当然,它返回true。然后仍然使用Customer对象检查它是否是String对象。不,肯定不是String我们新建了Customer对象,不是String对象。在这种情况下,它返回false。
真的就是这么简单!
//Vehicle is a function. But by naming conventions
//(first letter is uppercase), it is also an object
//constructor function ("class").
function Vehicle(numWheels) {
this.numWheels = numWheels;
}
//We can create new instances and check their types.
myRoadster = new Vehicle(4);
alert(myRoadster instanceof Vehicle);
我认为值得注意的是,instanceof是在声明对象时使用“new”关键字定义的。在JonH的例子中;
var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)
他没有提到的是;
var color1 = String("green");
color1 instanceof String; // returns false
指定"new"实际上是将String构造函数的结束状态复制到color1变量中,而不仅仅是将其设置为返回值。我认为这更好地展示了new关键字的功能;
function Test(name){
this.test = function(){
return 'This will only work through the "new" keyword.';
}
return name;
}
var test = new Test('test');
test.test(); // returns 'This will only work through the "new" keyword.'
test // returns the instance object of the Test() function.
var test = Test('test');
test.test(); // throws TypeError: Object #<Test> has no method 'test'
test // returns 'test'
使用"new"将函数内的"this"值赋给已声明的var,而不使用它则赋给返回值。
在“什么时候合适,什么时候不合适?”这个问题上,我的观点是:
Instanceof在生产代码中很少有用,但在希望断言代码返回/创建正确类型的对象的测试中很有用。通过明确您的代码返回/创建的对象类型,您的测试作为理解和记录代码的工具变得更加强大。
我刚刚发现了一个真实的应用程序,我想现在会更经常地使用它。
如果你使用jQuery事件,有时你想写一个更通用的函数,也可以直接调用(没有事件)。您可以使用instanceof来检查函数的第一个参数是否是jQuery实例。事件并做出适当的反应。
var myFunction = function (el) {
if (el instanceof $.Event)
// event specific code
else
// generic code
};
$('button').click(recalc); // Will execute event specific code
recalc('myParameter'); // Will execute generic code
在我的例子中,函数需要为所有(通过按钮上的单击事件)或仅为一个特定元素计算一些东西。我使用的代码:
var recalc = function (el) {
el = (el == undefined || el instanceof $.Event) ? $('span.allItems') : $(el);
// calculate...
};