原型上的吸气剂和二传手

时间:2013-12-06 14:49:32

标签: javascript jquery constructor

考虑下面的一点JavaScript :(我不担心向后兼容性,我不想使用很快就会被弃用的任何内容。)

  var Person = (function () {
            var _age,
                _name;
            function age(num) {
                if (!num) {
                    return _age;
                }
                else {
                    _age = num;
                }
            }
            function name(val) {
                if (!val) {
                    return _age;
                }
                else {
                    _name = val;
                }
            }
            return {
                age: age,
                name: name
            }
        })();
        console.log(Person.age()); //undefined
        Person.age(100);
        console.log(Person.age()); //100

(不知道这会有多大用处,如果我想做多态的话,这里的原型仍然是Object。)

VS。 (iffy中的构造函数,闭包允许名称和val接受_name和_val

  var Person = (function () {
            var _age,
                _name;
            function Person(options) {
                _age = options.age;
                _name = options.name;
            }
            Person.prototype.age = function (val) {
                if (!val) {
                    return _age;
                }
                else {
                    _age = val;
                }
            }
            var test = new Person({ age: 100, name: 'jon' });
            console.log(test.age());//100
           //if I want to do with Person objects outside of this script I should
           //return something
        })();

(这允许我正在寻找的标准属性样式(null参数返回一个值,传递参数将设置该值

function Person(age, name) {
        //i don't want to add get and set methods to each instance of Person
        }
        Person.prototype.age = function (num) {
            if (!num) {
                //what to return if nothing is passed to age?
                return //what?
            }
            else {
                //x = num
                //what would x be?
            }
        }

我需要能够基于原型以多态方式执行某些操作。最后一个代码片段是最容易阅读的,但它不提供我正在寻找的get / set succintness。第一个代码片段会让我Object.create足够好,但它有Object作为原型。如果我想要获取/ {设置obj.test()等方法并设置obj.test(100),我怎样才能在原型中添加方法而不是在构造函数本身内?

2 个答案:

答案 0 :(得分:3)

与你的问题没有直接关系,但是既然你在标题上提到了“getter and setters”,我想我可以用ES5 getter和setter补充答案:

function Person(age, name) {
  this.name = name;
  this.age  = age;
};

Object.defineProperty(Person.prototype, "age", {
  get: function() {
    return this._age;
  },

  // Added a few things to demonstrate additional logic on the setter
  set: function(num) {
    num = parseInt(num, 10);
    if(num > 0) {
      this._age = num;
    }
  }
});

然后,它可以透明地使用,就好像它是一个普通的属性:

var person = new Person(20, "Jane Doe");
person.age; // => 20

person.age = 15;
person.age; // => 15

person.age = "20";
person.age; // => 20 (number)

person.age = -2;
person.age; // => 20

适用于任何最近的浏览器,IE> = 9。

答案 1 :(得分:2)

您必须将其作为公共属性存储在您的实例上。常用的惯例是使用_表示私有成员。

以下是您的实施方案。

function Person(age, name) {
    this.age(age);
}
Person.prototype.age = function (num) {
    if (!num) {
        return this._age;
    }
    else {
        this._age = num;
    }
}