当以两种不同的方式定义原型时,Javascript构造函数的行为会有所不同

时间:2012-09-06 06:39:04

标签: javascript object prototype

我想要做的是在JavaScript中提取函数的名称。我不久前得到了这个工作,它看起来像这样:

MyObj = function myobj(){};

extend = function(obj){
    return /function (.+)\(/.exec(obj.constructor.toString())[1];
}

所以这是有趣的事情。当我以这种方式使用这个对象的原型时,一切正常:

MyObj.prototype.a = function(){}
MyObj.prototype.b = function(){}

extend(MyObj);
//->'myobj'

然而,当我像这样定义我的函数时:

MyObj.prototype = {
   a : function(){},
   b : function(){}
}

extend(MyObj);
//->'Object'

有没有人知道为什么后一种方法中的构造函数是JavaScript的本机代码(例如'Object')的一部分,而不是我的函数?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

尝试在第二种情况下添加构造函数属性 因为您正在覆盖prototype,所以您还会覆盖obj.prototype.constructor属性 所以像这样使用它:

MyObj.prototype = {
    constructor : MyObj,
    method1 : ...
}

答案 1 :(得分:0)

因为当您使用"MyObj.prototype.a"时,您正在使用原生原型并为其添加新功能。

但是当你使用另一种方式时,你正在用一个新的Object替换本机原型。