【问题标题】:Make a property either invokable or not使属性可调用或不可调用
【发布时间】:2017-05-10 21:00:14
【问题描述】:

我想让一个属性要么可调用,要么不可调用。比如:

function Test () {
  var obj = { someString: 'here is text' };

  Object.defineProperty(obj, 'string', {
    get: function() {
      return obj.someString;
    },
    set: function() {
      return function(val) {
        obj.someString = val;
      }
    }
  });

  return obj;
}

var test = new Test();

我可以这样做:

test.string // initially returns 'here is text'

test.string('new text here') // sets obj.someString to 'new text here'

test.string // returns 'next text here'

上面的代码目前没有按照我想要的方式运行。无论如何在JavaScript中做这样的事情吗?是否使用Object.defineProperty

【问题讨论】:

标签: javascript function defineproperty


【解决方案1】:

我不确定是否可以这样做。相反,如果设置了函数参数并且没有函数读取属性,您可以做条件:

function Test () {
  var obj = { 
    someString: 'here is text',
    string: function(val) {
      if(val == undefined) { // If the val parameter was not defined
        return this.someString; // Just return the property someString
      } else { // Otherwise, 
        this.someString = val; 
      }
    }
  };
  return obj;
}

var Tmp = new Test();
console.log(Tmp.string()); // This outputs 'here is text'
Tmp.string('New text!'); // This sets someString to 'New Text!'
console.log(Tmp.string()); // This outputs 'New Text!'

这与您想要的主要区别在于,您调用的是 Tmp.string(),而不是调用 Tmp.string 来检索值。

这是我的jsfiddle

【讨论】:

    【解决方案2】:

    你可以使用 ES6 语法:

    class Test{
      constructor(){
        this.someString = "here is text";
      }
    
      get string(){
        return this.someString;
      }
    
      set string(val){
        this.someString = val
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 2018-09-05
      • 2012-10-13
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多