首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JavaScript中操作符的实例是什么?

在JavaScript中操作符的实例是什么?
EN

Stack Overflow用户
提问于 2010-03-15 17:50:19
回答 11查看 276.9K关注 0票数 348

当第一次遇到instanceof时,JavaScript中的JavaScript关键字可能会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言。

  • 那是什么?
  • 它解决了哪些问题?
  • 什么时候合适,什么时候不合适?
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-03-15 17:52:03

实例数

左手侧(LHS)操作数是被测试到右侧(RHS)操作数的实际对象,RHS操作数是类的实际构造函数。基本定义是:

检查当前对象,如果对象是指定的对象类型,则返回true。

下面是一些好例子,下面是直接从Mozilla的开发人员站点获取的一个例子

代码语言:javascript
复制
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:

代码语言:javascript
复制
var p = new Person("Jon");
p instanceof Person

这是p instanceof Person,因为p是从Person.prototype继承的。

根据任择议定书的要求

我添加了一个小示例,并给出了一些示例代码和说明。

当您声明一个变量时,就给它一个特定的类型。

例如:

代码语言:javascript
复制
int i;
float f;
Customer c;

上面向您展示了一些变量,即ifc。这些类型是integerfloat和用户定义的Customer数据类型。像上面这样的类型可以用于任何语言,而不仅仅是JavaScript。但是,在JavaScript中,当您声明一个变量时,您没有显式地定义一个类型,var x,x可以是一个数字/字符串/用户定义的数据类型。因此,instanceof所做的是检查对象,看看它是否属于指定的类型,因此从上面取下Customer对象,我们可以这样做:

代码语言:javascript
复制
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。

真的很简单!

票数 307
EN

Stack Overflow用户

发布于 2011-06-30 15:56:59

到目前为止,任何评论似乎都没有涉及到其中一个重要的方面:继承。由于原型继承,通过使用instanceof计算的变量可以返回多个“类型”的true。

例如,让我们定义一个类型和一个子类型:

代码语言:javascript
复制
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;

现在我们有了几个“类”,让我们创建一些实例,并找出它们是哪些实例:

代码语言:javascript
复制
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

看到最后一行了吗?所有对函数的“新”调用都返回继承自对象的对象。即使使用对象创建速记,这也是正确的:

代码语言:javascript
复制
alert( 
    "Q: Is {} an instance of Object? "
+   "A: " + ( {} instanceof Object ) 
); // -> true

那么“类”定义本身又如何呢?他们的例子是什么?

代码语言:javascript
复制
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的人有帮助。

票数 97
EN

Stack Overflow用户

发布于 2012-02-09 23:04:33

这里的其他答案是正确的,但它们没有深入了解instanceof的实际工作方式,这可能会引起一些语言律师的兴趣。

JavaScript中的每个对象都有一个原型,可以通过__proto__属性访问。函数还有一个prototype属性,它是它们创建的任何对象的初始__proto__。在创建函数时,将为prototype提供一个唯一的对象。instanceof运算符使用此唯一性给您一个答案。如果您将instanceof作为一个函数编写,下面是它的样子。

代码语言:javascript
复制
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__属性之后重新分配它。这将给你一些有趣的结果:

代码语言:javascript
复制
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 false
票数 90
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2449254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档