我尝试跟随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
。为什么这样,我该如何解决?
答案 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是未定义的,所以这就是你得到的。
答案 2 :(得分:1)
由于编写Constr
是一个匿名函数,它已经将其原型对象的构造函数指向自身。我希望这本书能够让事情变得复杂:
var MyClass = (function () {
var Constr, cnt = 0;
Constr = function () {};
Constr.id = function () {
return "myid-" + cnt;
};
return Constr;
}());
没有严重的神秘感。