我有两个关于instanceof的问题:
如果我做了约翰的例子,人类就会将原型链1的实例化,并以这种方式工作:
var temp = john.constructor; while (true) { if (temp === Human) { return true; } temp = temp.prototype.constructor } return false;
如果是这样,说实例相对较慢,相比之下,简单地在每个对象的属性中存储一个唯一的接口id号. (我的意思是我们可以省略讨论这将是麻烦的,因为我确定有一些方法来创建一个自动化工具).
解决方法
在V8(Chrome的JS引擎)中,似乎几乎没有任何表现:
> function A(){} > function B(){} > function C(){} > function D(){} > B.prototype = new A(); > C.prototype = new B(); > D.prototype = new C(); > > var objA = new A(); > var objD = new D(); > > var start = (+new Date()); for(var i=0; i<10000000; i++){ objA instanceof A } console.log((+new Date()) - start); 138 > var start = (+new Date()); for(var i=0; i<10000000; i++){ objD instanceof A } console.log((+new Date()) - start); 138
Firefox显示相同的行为.
在这里有点疯狂,但是:
> var classes = []; > for(var i=0; i<10000; i++){ > classes[i] = function(){}; > i && (classes[i].prototype = new (classes[i-1])()); > } > > var obj0 = new classes[0],> obj9999 = new classes[9999]; > > var start = (+new Date()); for(var i=0; i<10000000; i++){ obj0 instanceof classes[0] } console.log((+new Date()) - start); 138 > var start = (+new Date()); for(var i=0; i<10000000; i++){ obj999 instanceof classes[0] } console.log((+new Date()) - start); 138