3

fullName他のすべてのプロパティのマッシュアップを返す1 つのパブリック アクセサー () を提供しながら、プライベート変数を使用する Javascript でビルダー パターンを作成しようとしています。この質問と回答は、プライベート変数にアクセスするために person コンストラクター内で使用できることを示唆していObject.definePropertyますが、機能しません - instance.fullNameis always 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
4

1 に答える 1

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/

于 2015-11-27T19:49:31.307 に答える