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

时间:2015-11-27 19:32:14

标签: javascript builder-pattern

我尝试在Javascript中使用私有变量创建构建器模式,同时提供一个返回所有其他属性的mashup的公共访问器(fullName)。 This question and answer建议我可以在人员构造函数中使用Object.defineProperty来访问私有变量,但它不起作用 - instance.fullName始终是undefined

如何使这个工作正常,以便构建器模式变量保持私有,但公共访问者可以在整个构建链中访问它们?

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

1 个答案:

答案 0 :(得分:3)

根据我的评论,更改传递给defineProperty()的对象:

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

http://jsfiddle.net/mattball/peztf9qs/