Javascript的构造函数和constructor属性


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