我尝试使用没有使用IIFE的私有变量和原型(这使得对象全局化,因此没有唯一的实例)。
我尝试了以下内容,我对所看到的内容感到困惑。我可以在检查员中完美地看到它的定义,但它告诉我它实际上并没有被定义。
究竟是什么导致它未定义,尽管看到它在检查员中定义了?
var Factory = Factory || {};
Factory.Person = function (aname)
{
var name = 'default';
function Person()
{
name = aname;
}
Person.prototype.getName = function() {
return name;
}
return Person;
};
var P = new Factory.Person('test');
alert(P.getName()); //Undefined
答案 0 :(得分:3)
getName
是Person
函数的原型的属性。它并不直接存在于Person
上,仅存在于Person
的实例上(使用new
关键字创建)。
(请注意,Person
和Factory.Person
是非常不同的对象。)
由于您使用的是工厂模式:请勿触摸原型或new
关键字。
var Factory = Factory || {};
Factory.Person = function (aname)
{
// You need to check for aname here
var name = aname || 'default';
// There doesn't seem to be any point in making Person a function
var Person = {};
// No prototype here
Person.getName = function() {
return name;
}
return Person;
};
// No new keyword here
var P = Factory.Person('test');
alert(P.getName());
如果您想使用原型,那么您可以这样做:
function Person(aname) {
this.name = aname || 'default';
};
Person.prototype.getName = function() {
return this.name;
}
var p = new Person('test');
alert(p.getName());