【问题标题】:Understanding instanceof with JavaScript用 JavaScript 理解 instanceof
【发布时间】:2012-11-05 01:24:28
【问题描述】:

我对 JavaScript 中的 instanceof 有基本的了解,测试左侧对象是否“属于”右侧对象类型。以下 2 个示例帮助我理解...

var demo1 = function() {};
demo1.prototype = {
foo: "hello"
};

var demo2 = function() {
var pub = {
    bar:"world"
};
return this.pub;
};

var obj1 = new demo1();
var obj2 = new demo2();

console.log(obj1 instanceof demo1);  //returns true
console.log(obj2 instanceof demo2);  //returns true

但是在这第三个例子中,我得到了错误,我不明白为什么......

var o = {}; // new Object;
o.toString(); // [object Object]
console.log(o instanceof toString); //returns false

感谢您在了解发生了什么方面提供的任何帮助。还有……可以让第三个例子成立吗?

再次感谢

【问题讨论】:

  • 你的demo2 函数搞砸了。没有this.pub,所以它将返回undefined,当使用new 运算符调用时,这将导致一个空对象(至少是instanceof demo2
  • 它对我来说返回 true,我使用的是基于 T.J. 的示例。克劳福德的博客在这里 - blog.niftysnippets.org/2010/03/anonymouses-anonymous.html
  • 是的,obj2 instanceof demo2 对我来说也是 true。尽管如此,您的构造函数还是没用的,可以用空函数替换。我看不出你是如何从那篇非常好的文章中的任何例子中得出的。
  • Bergi 我没有发布示例 2 作为模式的最佳实践,我知道这一点。它基于对该文章的博客评论的回复。就这样。我计划使用标准模式来实现我的目标。感谢您对远离上述风格的严厉批评。是的,这是一篇很棒的文章。

标签: javascript instanceof


【解决方案1】:

toString 不会导致o 的类型更改。它只是返回对象的字符串表示,而不改变它。所以,o 仍然是一个简单的对象,而不是 instanceof String

var o = {}; // new Object object
var ostring = o.toString(); // "[object Object]"
typeof o; // object
typeof ostring; // string - this is a primitive value, not an object; so that
ostring instanceof String; // is false
var stringobj = new String(ostring); // new String object
typeof stringobj; // object
stringobj instanceof String; // true!
o instanceof Object; // also true!

另见MDN reference for the String constructor

【讨论】:

    【解决方案2】:

    o 是一个objecttoStringfunction。它们是 JavaScript 中的不同类型。

    alert(typeof(o));  //"object"
    alert(typeof(toString)); //"function"
    

    JavaScript 区分对象和函数。因此,这就是您在示例中返回 false 的原因。

    【讨论】:

    • obj2 是一个对象,而 demo2() 是一个函数。我刚刚在我的 Web 控制台中对其进行了测试,但我得到了他们的“回归真实”。所以必须比你所说的更多......
    • 查看这个 SO 问题 - stackoverflow.com/questions/2449254/…。在接受的答案中,如果对象继承自 RHS 的原型,则 LHS 上的变量将返回 true。这就是您在obj2 = new demo2() 声明中所做的。所以obj2 继承自demo2 原型。因此,obj2demo2 的一个实例。 otoString 没有共同原型相关,因此 instanceof 检查返回 false。我希望这会有所帮助。
    • 是的,这对我有帮助。谢谢大卫
    • 没问题 - 很高兴我能帮上忙。
    【解决方案3】:

    使用像这样的对象字面量

    var o = {}; // new Object;
    

    您创建了一个原型为Object 的对象。使用instanceof 进行测试不会产生任何有用的信息。唯一会产生 true 的比较是

    o instanceof Object
    

    【讨论】:

    • 谢谢英戈!这也有助于我理解我现在正在比较的东西!
    猜你喜欢
    • 2013-03-19
    • 2015-02-22
    • 1970-01-01
    • 2012-02-11
    • 2011-03-09
    • 2012-07-24
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多