在构造函数函数中创建只读(get)属性
Create read only (get) property in constructor function
我正试图用Javascript在构造函数上创建一个只读属性。我重新混合了我在MDN上找到的语法,但这不起作用:
function Person(data) {
var self = this;
self.firstName = data.firstName || "John";
self.lastName = data.lastName || "Doe";
get fullName() { return self.firstName + " " + self.lastName; }
}
var mike = new Person({ firstName: "Mike", lastName: "Michaelson" });
document.write(mike.fullName);
这将引发一个异常:
未捕获的SyntaxError:意外的标识符
我尝试过其他选择,包括:
{ get fullName() { return self.firstName + " " + self.lastName; } }
和:
get this.fullName() { return self.firstName + " " + self.lastName; }
和:
get self.fullName() { return self.firstName + " " + self.lastName; }
但这些选择都不起作用。
这个做工作:
function Person(data) {
var self = this;
self.firstName = data.firstName || "John";
self.lastName = data.lastName || "Doe";
Object.defineProperty(self, "fullName", { get: function () { return self.firstName + " " + self.lastName; } });
}
var mike = new Person({ firstName: "Mike", lastName: "Michaelson" });
document.write(mike.fullName);
但很明显,defineProperty
的这种方式感觉很笨拙。
在构造函数函数中定义仅get
属性的正确语法是什么?
我建议将其作为一个POJO,并一直传递选项,但您仍然会有Object.defineProperties
的"笨拙",只是没有实际调用它的仪式(我个人更喜欢缩写)。
var Person = function (data) {
if (data === undefined) {
data = {};
}
data = _.defaults(data, {
firstName: 'John',
lastName: 'Doe'
});
return {
get firstName() { return data.firstName; },
get lastName() { return data.lastName; },
get fullName() { return data.firstName + ' ' + data.lastName; }
}
}
EDIT:现在我已经考虑了更多,我认为您想要包含defineProperty
语法的原因是因为您想要对名字和姓氏具有读/写访问权限,但对fullName
具有只读访问权限。如果这个假设是正确的,这就是我通常使用的模式。
var Person = function (data) {
if (data === undefined) {
data = {};
}
data = _.defaults(data, {
firstName: 'John',
lastName: 'Doe'
});
return {
get firstName() { return data.firstName; },
set firstName(name) { data.firstName = name; },
get lastName() { return data.lastName; },
set lastName(name) { data.lastName = name; },
get fullName() { return data.firstName + ' ' + data.lastName; }
}
}
p = Person();
p.fullName === 'John Doe'; // true
p.firstName = 'Jane';
p.fullName === 'Jane Doe'; // true
但是,需要注意一些注意事项,主要是对象引用。
data = { firstName: 'Jane' };
p = Person(data);
p.fullName === 'Jane Doe'; // true
data.lastName = 'Goodall';
p.fullName === 'Jane Doe'; // false!
console.log(p.fullName); // 'Jane Goodall'
我通常更喜欢将参数作为不可变的东西传递,或者通过将它们从对象中复制到不可变的对象中来冻结这些特性,这样通过对象引用进行更新就不会在你的行为中引起微妙的错误。
相关文章:
- 在不使用lodash-get的情况下从json中提取深层属性
- JS get元素之间的差异's属性与elem.getAttribute(attr)和elem[attr]
- Angularjs类型错误:无法读取属性'GET()'的未定义
- 如何使用get()获取嵌套的Scope属性
- 尝试更改HTML属性时出现奇怪的get请求
- 角度类型错误:无法读取未定义的属性“get”
- 类型错误:无法读取 AngularJS 上未定义的属性“get”
- 如何将 GET 参数分配给 HTML 输入文本的值属性
- jQuery get 属性在点击时
- JS getters:定义属性替换或补充旧的内联“get”“set”语法
- AngularJS 错误:无法读取未定义的属性“get”
- Angularjs.在 http.get 之后显示对象属性
- jQuery get 每个元素的属性
- 如何使用 get/set 获取属性以使用 JSON.stringify() 序列化
- 具有对象类型的参数,其属性名称/值各不相同.需要在GET请求中通过URL发送道具名称/值
- jQuery - get属性返回undefined
- 主干get属性返回未定义
- Adobe Livecycle javascript get属性节点
- 对象get属性中的Javascript对象
- 如何从html文件中的li标签调用get属性