【发布时间】:2014-08-18 15:37:23
【问题描述】:
在下面的代码示例中,以 instanceof 结尾的 obj2 和 obj3 的检查都返回 true,即使它们的构造方式不同并且返回的结果 name属性不同。
var Obj1 = function() {
this.name = "foo1";
};
Obj1.prototype.name = "foo1onProt";
var obj1 = new Obj1();
var Obj2 = function() {};
Obj2.prototype = new Obj1();
Obj2.prototype.constructor = Obj2;
var obj2 = new Obj2();
var Obj3 = function() {};
Obj3.prototype = Object.create(Obj1.prototype);
Obj3.prototype.constructor = Obj3;
var obj3 = new Obj3();
console.dir(obj1);
console.log("obj1.name: " + obj1.name);
console.dir(obj2);
console.log("obj2.name: " + obj2.name);
console.dir(obj3);
console.log("obj3.name: " + obj3.name);
console.log("obj2 instanceof Obj1: " + (obj2 instanceof Obj1));
console.log("obj3 instanceof Obj1: " + (obj3 instanceof Obj1));
在 Chrome 中运行的结果:
Obj1
name: "foo1"
__proto__: Object
constructor: function () {
name: "foo1onProt"
__proto__: Object
obj1.name: foo1
Obj2
__proto__: Obj1
constructor: function () {}
name: "foo1"
__proto__: Object
constructor: function () {
name: "foo1onProt"
__proto__: Object
obj2.name: foo1
Obj3
__proto__: Object
constructor: function () {}
__proto__: Object
constructor: function () {
name: "foo1onProt"
__proto__: Object
obj3.name: foo1onProt
obj2 instanceof Obj1: true
obj3 instanceof Obj1: true
识别 obj2 和 obj3 不同的最佳方法是什么? instanceof 实际上是如何工作的?
【问题讨论】:
-
您创建了两个不同的对象,都以 Obj1 作为其基础 - 然后您询问它们是否是 Obj1 的实例。嗯,是的,他们都是。如果您想知道它们是否不同,只需使用
===运算符即可。 -
@AHM 我看到你的回复来自很多年前,但是我从未见过使用严格相等来直接比较 JavaScript 对象的方法。你介意扩展你上面关于“objA === objB”的评论的意思吗? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
-
对于对象,只有当比较的两个对象是同一个对象时,=== 运算符才会返回 true。虽然您通常不会将对象与其自身进行比较,但如果您想找出已知集合中的哪个对象,您有参考,这可能会很有用。
标签: javascript