如何在Javascript对象(Class)中使用setter和getter?

时间:2015-05-10 15:28:44

标签: javascript class setter getter getter-setter

以下脚本不起作用。什么是正确的方法?

function AnObject () {
    get this.apple = () {
        return this.apple + "GET";
    }
    set this.apple = ( newValue ) {
        return newValue + "SET";
    }
}

var obj = new AnObject();
obj.apple = "Lemon";
console.log( obj.apple ); // LemonSETGET

4 个答案:

答案 0 :(得分:5)

您可以使用Object.defineProperties()

function AnObject() {
  Object.defineProperties(this, {
    apple: {
      get: function() {
        return this._apple + " GET";
      },
      set: function(value) {
        this._apple = value;
      },
      configurable: true, writable: true
    }
  });
 }

请注意,如果要直接保持对象的值,则必须小心使用其他属性名称。如果没有,你可以使用构造函数的闭包:

function AnObject() {
  var theApple;

  Object.defineProperties(this, {
    apple: {
      get: function() {
        return theApple + " GET";
      },
      set: function(value) {
        theApple = value;
      },
      configurable: true, writable: true
    }
  });
 }

答案 1 :(得分:3)

添加到Pointy的......点,

您可以将getter和setter用作语言功能,方法是将它们放在Object Literals中。

您可以将原始构造函数转换为工厂,只需执行以下操作即可使用基于实例的getter和setter:

function makeAnObject () {
    var hiddenApple = "Granny Smith";
    return {
      get apple () { return hiddenApple; },
      set apple (ignore) { return hiddenApple; }
    };
}

var thing = makeAnObject();
thing.apple;
thing.apple = "Crab Apple";

请记住,取决于getter / setter,在旧浏览器上会爆炸式爆炸(IE8在这里真的很棒),就这样使用了。

另外,在defineProperties中使用它们可以防止IE8爆炸(因为它不再是语言构造)...... ... buuuut,它实际上并没有添加getter / setter,或者(即使使用polyfill将方法添加到Object,而不仅仅是DOM Elements),因此,由于语法爆炸,或者由于与其他浏览器完全不同,会产生错误行为。< / p>

这可能现在不适用于您,希望它永远不会... ......我们中的一些人仍然生活在那个可怕的现实中。

答案 2 :(得分:1)

class User {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }


  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }


  set fullName(newValue) {
    [this.firstName, this.lastName] = newValue.split(' ');
  }



};

let user = new User("AAAA", "BBBB");
alert( user.fullName ); 
user.fullName = "CCCC DDDD";
alert( user.fullName ); 

答案 3 :(得分:0)

JS中没有setter和getter

但你可以效仿它们

function AnObject () {
    var apple = '';
    this.get = function() {
        return apple + "GET";
    }
    this.set = function( newValue ) {
        apple = newValue + "SET";
    }
}

var obj = new AnObject();
obj.set("Lemon");
console.log( obj.get() ); // LemonSETGET