Closed
Bug 274122
Opened 20 years ago
Closed 20 years ago
instanceof incorrectly returns true for different instances of a closure
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
DUPLICATE
of bug 254067
People
(Reporter: spiff, Unassigned)
Details
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10
Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10
This code demonstrates the problem:
function makecls(name) {
return function() { this.clsname = name };
}
A = makecls('a'); a = new A();
B = makecls('b'); b = new B();
if (a instanceof B) alert('BUG!');
A and B are different function objects, and neither of their prototypes is an
instance of the other constructor, so a should not be an instance of B.
The ECMA-Script standard says that instanceof is to be implemented via a
HasInstance function, which should in this case take the prototype property of B
and compare it to each object in the prototype chain of a.
However, B (correctly) is not on that prototype chain, as can be easily
demonstrated with
B.prototype.fun = 42;
alert(a.fun); // undefined
Hence, the instanceof operator seems to be the culprit. Note that isPrototypeOf
works correctly:
alert(B.prototype.isPrototypeOf(a)); // false
Reproducible: Always
Steps to Reproduce:
see Details
Actual Results:
see Details
Expected Results:
see Details
Comment 1•20 years ago
|
||
Works for me in a trunk js shell:
$ Linux_All_DBG.OBJ/js
js> alert=print
function print() {
[native code]
}
js> function makecls(name) {
return function() { this.clsname = name };
}
js> A = makecls('a'); a = new A();
[object Object]
js> B = makecls('b'); b = new B();
[object Object]
js> if (a instanceof B) alert('BUG!');
js> a instanceof A
true
js> a instanceof B
false
js> b instanceof A
false
js> b instanceof B
true
js>
You are using an older version of Gecko than the trunk version. This looks like
a dup of bug 254067. If you want that bug fixed in 1.7.6 and any other branch
releases, please nominate it by setting the blocking1.7.6 flag to [?].
/be
*** This bug has been marked as a duplicate of 254067 ***
Status: UNCONFIRMED → RESOLVED
Closed: 20 years ago
Resolution: --- → DUPLICATE
You need to log in
before you can comment on or make changes to this bug.
Description
•