为Javascript对象中的局部变量创建setter

为Javascript对象中的局部变量创建setter,javascript,Javascript,我有以下代码 var loyaltyObject = (function () { var data = null, vm, getLoyaltyUrl; function getData() { $.ajax({ type: 'POST', url: getLoyaltyUrl, contentType: 'application/json; charset=utf-8', dataType: 'json', suc

我有以下代码

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;
}());
准备好我打电话了吗

function Init() {
    window.loyaltyObject.getLoyaltyUrl = '@Url.Action("GetLoyaltyData", "Orders")';
    window.loyaltyObject.getData();
}
window.loyaltyObject.getLoyaltyUrl
确实是url,但是内部的
getLoyaltyUrl
仍然没有定义

我阅读了下面关于设置getter的内容,但是我将如何执行setter,我将设置的
this
值是什么

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

但是我如何执行setter,我要设置的
这个
值是什么

您只需分配给变量
getLoyaltyUrl

vm = {
  // ...
  set getLoyaltyUrl(value) {
    getLoyaltyUrl = value;
  },
}
在您的情况下,您不会使用
<代码>值
是指定给属性的值

但是我如何执行setter,我要设置的
这个
值是什么

您只需分配给变量
getLoyaltyUrl

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

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

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

只要改变一下:

url: getLoyaltyUrl

简化示例

var-loyaltyObject=(函数(){
var数据=null,vm;
函数getData(){
//为一个简单的控制台切换了ajax。log()
console.log(vm.getLoyaltyUrl)
}
vm={
getData:getData,
getLoyaltyUrl:null
};
返回虚拟机;
}());
//以下就是你所拥有的
函数Init(){
window.loyaltyObject.getLoyaltyUrl='@Url.Action(“GetLoyaltyData”,“Orders”);
window.loyaltyObject.getData();
}

Init()。该变量没有从对象
vm
继承,因此它永远不会在代码中定义

只要改变一下:

url: getLoyaltyUrl

简化示例

var-loyaltyObject=(函数(){
var数据=null,vm;
函数getData(){
//为一个简单的控制台切换了ajax。log()
console.log(vm.getLoyaltyUrl)
}
vm={
getData:getData,
getLoyaltyUrl:null
};
返回虚拟机;
}());
//以下就是你所拥有的
函数Init(){
window.loyaltyObject.getLoyaltyUrl='@Url.Action(“GetLoyaltyData”,“Orders”);
window.loyaltyObject.getData();
}

Init()
我认为这里不需要自定义属性。但您可以查看Object.defineProperty或它的对应项来动态更改对象属性

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

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

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

FWIW,我认为人们期望以
get…
开头的属性实际上是函数。不将URL作为
getData
的参数的原因是什么?
vm
将getLoyaltyUrl作为(公共)属性,不需要设置器。或者您想将其设置为
loyaltyObject
?只需在方法中使用
this.getLoyaltyUrl
属性并删除局部变量。将URL设置为参数对我来说似乎更自然。它更有表现力。“我想从此URL加载数据”vs“将此属性设置为URL,然后获取数据”。FWIW,我认为以
get…
开头的属性实际上是函数。为什么不将URL作为
getData
的参数?
vm
将getLoyaltyUrl作为(公共)属性,不需要二传手。或者您想将其设置为
loyaltyObject
?只需在方法中使用
this.getLoyaltyUrl
属性并删除局部变量。将URL设置为参数对我来说似乎更自然。它更有表现力。“我想从此URL加载数据”vs“将此属性设置为URL,然后获取数据”。