在Javascript对象中为局部变量创建一个setter

时间:2017-07-10 23:40:35

标签: javascript

我有以下代码

var loyaltyObject = (function () {
  var data = null, vm, getLoyaltyUrl;

  function getData() {
    $.ajax({
      type: 'POST',
      url: getLoyaltyUrl,
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',
      success: function (resp) {
        data = resp;
      },
      error: function (resp) {
        console.log('Error fetching offers!');
        console.log(resp);
      }// error(resp)
    });// $.ajax()  
  }

...

  vm = {
    getData: getData,
    getLoyaltyUrl: getLoyaltyUrl
  };

  return vm;
}());

on document.ready我打电话

function Init() {
    window.loyaltyObject.getLoyaltyUrl = '@Url.Action("GetLoyaltyData", "Orders")';
    window.loyaltyObject.getData();
}

window.loyaltyObject.getLoyaltyUrl确实是网址,但内部getLoyaltyUrl仍未定义。

我阅读了以下return a variable as a property关于设置getter的内容,但是如何执行setter,我将设置的thisvalue是什么?

在大多数浏览器上也可以比较吗?

3 个答案:

答案 0 :(得分:2)

您要将值vm.getLoyaltyUrl分配给私有变量getLoyaltyUrl。该变量没有来自对象vm的继承,因此它永远不会在您的代码中定义

只需改变:

url: getLoyaltyUrl

url: vm.getLoyaltyUrl

简化示例

var loyaltyObject = (function () {
  var data = null, vm;

  function getData() {
   // switched out the ajax for a simple console.log()
   console.log(vm.getLoyaltyUrl)
  }

  vm = {
    getData: getData,
    getLoyaltyUrl: null
  };

  return vm;
}());
// following is exactly what you have
function Init() {
    window.loyaltyObject.getLoyaltyUrl = '@Url.Action("GetLoyaltyData", "Orders")';
    window.loyaltyObject.getData();
}

Init()

答案 1 :(得分:1)

  

但我如何执行制定者,我要设置的thisvalue是什么?

您只需分配给变量getLoyaltyUrl

vm = {
  // ...
  set getLoyaltyUrl(value) {
    getLoyaltyUrl = value;
  },
}

在您的情况下,您不会使用thisvalue是分配给该属性的值。

答案 2 :(得分:0)

我认为这里不需要定制房产。但您可以查看Object.defineProperty或它的Reflect对应物来动态更改对象属性。

Object.defineProperty(obj, 'getLoyaltyUrl', {
    set: (value) => {
        // do something here, better be worth it.
    },
    get: () => {}
})