Chrome下执行如下代码:
注意,这个时候obj的constructor已经不再是创建它的函数,但是修改构造函数的prototype的contructor并不会影响构造函数所产生的对象!
这里仍然会调用原来定义的MyClass进行构造,而不会调用新的MyClass.prototype.constructor进行构造。
更多烧脑筋的constructor例子请 参考:Constructors considered mildly confusing (如果连接无法打开,可向作者索要pdf文档)
这里仅摘录两段 instanceof 例子:
function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject instanceof MyConstructor // true
function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject instanceof Object // true
原因用作者的话说,When instanceof is called it checks the prototype property of the given constructor and checks it agains the [[Prototype]] chain of the given object. In other words, it's not dependent on theconstructor property.
MyConstructor.prototype 为{},看它是否被myobject的[[Prototype]]链所包含。
再变态一点:
function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype = {};
[ myobject instanceof MyConstructor, // false !
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ] // true