未定义不是函数

时间:2014-08-13 15:04:24

标签: javascript

我尝试使用没有使用IIFE的私有变量和原型(这使得对象全局化,因此没有唯一的实例)。

我尝试了以下内容,我对所看到的内容感到困惑。我可以在检查员中完美地看到它的定义,但它告诉我它实际上并没有被定义。

究竟是什么导致它未定义,尽管看到它在检查员中定义了?

Screenshot

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

1 个答案:

答案 0 :(得分:3)

getNamePerson函数的原型的属性。它并不直接存在于Person上,仅存在于Person实例上(使用new关键字创建)。

(请注意,PersonFactory.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());