javascript中的自动getter和setter(带验证)

时间:2013-07-04 02:39:42

标签: javascript prototype

我正在构建一个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();
.......

是否有开箱即用的方法来实现这个目标?

2 个答案:

答案 0 :(得分:3)

首先,您无法在prototype上定义getter和setter函数,因为它们需要能够访问只能在构造函数中访问的nameage。因此,您需要在构造函数中定义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并访问其nameage属性,如下所示:

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);

请参阅演示:http://jsfiddle.net/aVM2J/

答案 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