3

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

是否有开箱即用的方法来实现这一点?

4

2 回答 2

3

首先,您不能在 上定义 getter 和 setter 函数,prototype因为它们需要能够访问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);
}

现在您可以访问 create aPerson并访问它们的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/

于 2013-07-04T03:02:20.150 回答
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
于 2013-07-04T02:55:03.223 回答