Javascript 使用私有变量的构建器模式
Javascript builder pattern using private variables
我正在尝试在 Javascript 中创建一个使用私有变量的构建器模式,同时提供一个 public 访问器 (fullName
) returns所有其他属性。 This question and answer 建议我可以在 person 构造函数中使用 Object.defineProperty
来访问私有变量,但它不起作用 - instance.fullName
始终是 undefined
.
如何使构建器模式变量保持私有,但 public 访问器可以在整个构建链中访问它们?
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()
的对象:
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
我正在尝试在 Javascript 中创建一个使用私有变量的构建器模式,同时提供一个 public 访问器 (fullName
) returns所有其他属性。 This question and answer 建议我可以在 person 构造函数中使用 Object.defineProperty
来访问私有变量,但它不起作用 - instance.fullName
始终是 undefined
.
如何使构建器模式变量保持私有,但 public 访问器可以在整个构建链中访问它们?
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()
的对象:
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