原型上的 getter 和 setter

woo*_*gie 2 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
Run Code Online (Sandbox Code Playgroud)

(不确定这会有多大用处,如果我想做一些多态的事情,这里的原型仍然是 Object。)

vs. (iffy 中的构造函数,闭包允许 name 和 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
        })();
Run Code Online (Sandbox Code Playgroud)

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

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?
            }
        }
Run Code Online (Sandbox Code Playgroud)

我需要能够基于原型以多态方式执行一些操作。最后一段代码最容易阅读,但它没有提供我正在寻找的 get/set 简洁性。第一个代码片段会让我感觉Object.create很好,但它以 Object 作为原型。如果我想要像obj.test()get 和obj.test(100)to set这样的 get/set 方法,我怎样才能在原型中而不是在构造函数内部实现这种添加方法?

Ren*_*non 5

与您的问题没有直接关系,但由于您在标题中提到了“getter 和 setter”,我想我可以用 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;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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