我正在构建一个javascript库,我必须创建一个类的日志,其中大多数都有很多必须为用户公开的属性。
例如:
function Person(name,age){
}
现在我想为属性(名称和年龄)创建getter和setter。
Nornall,我必须将这些方法添加到Person.prototype
:
Person.prototype.getName=function(){}
Person.prototype.setName=function(x){
//check if x is typeof String
}
Person.prototype.getAge=function(){}
Person.prototype.setAge=function(x){
//check if x is typeof Number
}
这将导致两行重复的代码。
所以我想知道我是否可以调用这样的方法:
makeThesePropertiesPublic(Person,{
name:"string",
age:"number"
});
然后我可以这样称呼:
var p=new Person("xx",1);
p.getName();
p.getAge();
.......
是否有开箱即用的方法来实现这个目标?
答案 0 :(得分:3)
首先,您无法在prototype
上定义getter和setter函数,因为它们需要能够访问只能在构造函数中访问的name
和age
。因此,您需要在构造函数中定义getter和setter函数。
我会这样做:
function Person(name, age) {
var private = {
name: name,
age: age
};
Object.defineProperties(this, {
name: getAccessor(private, "name", "String"),
age: getAccessor(private, "age", "Number")
});
}
function getAccessor(obj, key, type) {
return {
enumerable: true,
configurable: true,
get: function () {
return obj[key];
},
set: function (value) {
if (typeOf(value) === type)
obj[key] = value;
}
};
}
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
现在,您可以访问创建Person
并访问其name
和age
属性,如下所示:
var person = new Person("Aadit M Shah", 20);
person.name = 0; // it won't set the name
person.age = "twenty"; // it won't set the age
alert(person.name);
alert(person.age);
答案 1 :(得分:0)
这样的事情怎么样?
function Person(n, a) {
var name = n;
var age = a;
var person = {};
person.getName = function () {
return name
}
person.getAge = function () {
return age;
}
return person;
}
var p = Person("jon",22);
console.log(p.getName());//jon