为什么我得到未定义的构造函数

时间:2016-01-31 18:54:37

标签: javascript

我尝试跟随Stephan Stoyanov关于JavaScript设计模式的书。本书中的一个例子与此类似:

var MyClass = (function () {
    var Constr, cnt = 0;
    Constr = function () {};    
    Constr.id = function () {
        return "myid-" + cnt;
    };
    Constr.prototype = {
        constructor: MyClass // <-- Please, pay attention
    };
    return Constr;
}());

然而,当我像这样使用这段代码时:

var tst = new MyClass();
console.log(tst.contructor);

我在控制台中看到undefined。为什么这样,我该如何解决?

3 个答案:

答案 0 :(得分:2)

在您将MyClass分配给原型的.constructor属性时,变量MyClass尚未初始化。在函数执行完之后,它才会有值。相反,您可以只指定它Constr,因为它确实有一个值,它们将是最终分配给MyClass的相同值。

var MyClass = (function () {
    var Constr, cnt = 0;
    Constr = function () {};    
    Constr.id = function () {
        return "myid-" + cnt;
    };
    Constr.prototype = {
        constructor: Constr // <-- Change to this
    };
    return Constr;
}());

答案 1 :(得分:1)

问题在于:

     Constr.prototype = {
         constructor: MyClass // MyClass is undefined right now!
     };

当函数将MyClass指定为构造函数属性的值时,该函数尚未完成。在这一点上,MyClass是未定义的,所以这就是你得到的。

请参阅:https://jsfiddle.net/vh45can8/

答案 2 :(得分:1)

由于编写Constr是一个匿名函数,它已经将其原型对象的构造函数指向自身。我希望这本书能够让事情变得复杂:

var MyClass = (function () {
    var Constr, cnt = 0;
    Constr = function () {};    
    Constr.id = function () {
        return "myid-" + cnt;
    };
    return Constr;
}());

没有严重的神秘感。