Javascript单例私有函数在从另一个方法调用时不访问对象属性

Javascript单例私有函数在从另一个方法调用时不访问对象属性,javascript,methods,properties,singleton,Javascript,Methods,Properties,Singleton,我有一个简单的单例对象,当一个方法调用另一个返回对象属性的方法时遇到问题 var Customer = (function () { var instance; function init() { this.firstName = ""; this.lastName = ""; function _myGetFirstName() { return this.firstName; } function _myGetLastNam

我有一个简单的单例对象,当一个方法调用另一个返回对象属性的方法时遇到问题

var Customer = (function () {

var instance;

function init() {


    this.firstName = "";
    this.lastName = "";

    function _myGetFirstName() {
        return this.firstName;
    }

    function _myGetLastName() {
        return this.lastName;
    }

    function _myGetFullName() {
        return _myGetFirstName() + ' ' + _myGetLastName();
    }

    function _mySetFirstName(p) {
        this.firstName = p;
    }

    function _mySetLastName(p) {
        this.lastName = p;
    }

    return {

        setFirstName: _mySetFirstName,
        setLastName: _mySetLastName,
        getFirstName: _myGetFirstName,
        getLastName: _myGetLastName,
        getFullName: _myGetFullName,
    };

};

return {

    getInstance: function () {

        if (!instance) {
            instance = init();
        }

        return instance;
    }

};

})();
我使用的对象如下所示:

var cust = Customer.getInstance();
cust.setFirstName('FOO');
cust.setLastName('BAR');

console.log(cust.getFirstName());  // displays FOO - OK
console.log(cust.getLastName());   // displays BAR - OK
console.log(cust.getFullName());   // displays nothing

这是一种我在网上见过多次的模式,但我就是无法让它发挥作用。“\u myGetFullName”方法有什么错?当我得到每个人的名字和姓氏时,效果很好。谢谢

您返回的
实例
是一个新的
对象
,其中包含一些已知的方法。本地方法不在
实例
的范围内。您应该调用实例方法,因此:

function _myGetFullName() {
        return this.getFirstName() + ' ' + this.getLastName();
}
或者在当前
实例的上下文中调用函数

  function _myGetFullName() {
      return _myGetFirstName.call(instance) + ' ' + 
             _myGetLastName.call(instance);
  }
或者,当然

function _myGetFullName() {
        return this.firstName + ' ' + this.lastName;
}

无论如何,你的代码有点奇怪。您只能派生Customer的一个实例。你不是说什么吗?

谢谢。这是一个单例,所以我只想要一个实例。仅返回this.firstName+“”+this.lastName的选项适用于这个虚构的示例,但在我的实际应用程序中,在返回名称之前还有其他代码。(即,想象复杂的计算而不是名称)。