使用私有变量的Javascript构建器模式

使用私有变量的Javascript构建器模式,javascript,builder-pattern,Javascript,Builder Pattern,我试图在Javascript中创建一个使用私有变量的构建器模式,同时提供一个公共访问器(fullName),返回所有其他属性的mashup。建议我可以在person构造函数中使用Object.defineProperty,以访问私有变量,但它不起作用-实例。全名始终是未定义的 我怎样才能使构建器模式变量保持私有,但公共访问器可以在整个构建链中访问它们 var Person = function () { var _firstName, _lastName Object.defi

我试图在Javascript中创建一个使用私有变量的构建器模式,同时提供一个公共访问器(
fullName
),返回所有其他属性的mashup。建议我可以在person构造函数中使用
Object.defineProperty
,以访问私有变量,但它不起作用-
实例。全名
始终是
未定义的

我怎样才能使构建器模式变量保持私有,但公共访问器可以在整个构建链中访问它们

var Person = function () {
    var _firstName, _lastName

    Object.defineProperty(this, "fullName", {
        get: function () {
            return _firstName + ' ' + _lastName;
        }
    });

    return {
        firstName: function (n) {
            _firstName = n
            return this
        },
        lastName: function (n) {
            _lastName = n
            return this
        }
    }
}

var x = new Person().firstName('bob').lastName('dole');

console.log(x.fullName); // always undefined

根据我的注释,将传递的对象更改为
defineProperty()


我怀疑这是因为从
Person
返回的对象与调用
object.defineProperty()
this
不同。嗯,坦白说
object.defineProperty()
并不是这样做的正确方法。如果我必须使用公共属性,这很好,但即使使用
这个。_firstName
等也不能用于此设计。热!非常感谢。有道理。
var Person = function () {
    var _firstName, _lastName

    var _self = {
        firstName: function (n) {
            _firstName = n
            return this
        },
        lastName: function (n) {
            _lastName = n
            return this
        }
    }

    Object.defineProperty(_self, "fullName", {
        get: function () {
            return _firstName + ' ' + _lastName;
        }
    });

    return _self;
}

var x = new Person().firstName('bob').lastName('dole');

console.log(x.fullName); // bob dole