如何在`this`的方法中引用`this`属性?

时间:2015-09-26 10:37:48

标签: javascript

我将var strVal = $.trim($('.txtValue').val()); var lastChar = strVal.slice(-1); if (lastChar == ',') { strVal = strVal.slice(0, -1); } 属性附加到services

this

然后将方法附加到function Client(){ this.services = { 'propertyName' : {} }; ,我需要在其中引用this实例的services属性:

client

function Client(){ this.services = { 'propertyName' : {} }; this.someMethod = function () { if (this.services['propertyName']) { //do something } } } var clientName = new Client(); 未定义。如何在分配给this.services - line 6的方法中使用分配给this的属性?似乎应该是可能的,因为在构造函数调用该方法时,对象将存在this属性。这是语言限制吗?可能吗?应该是吗?

1 个答案:

答案 0 :(得分:2)

  

但是this.services - 第6行未定义。

这完全取决于你如何调用 someMethod。如果你这样称呼它:

clientName.someMethod();

...一切都会好的,因为调用中的this将是new Client创建的services属性的对象。但是在JavaScript中,this不是具有普通函数的固定事物,而是由设置函数的方式设置。所以:

var f = clientName.someMethod;
f();

...会失败,因为this不会是你期望的对象。 (ES6的新“箭头”功能不是这样,它从定义它们的位置得到this,而不是它们被调用的方式。)

当函数用作回调函数时,您通常会看到这一点:

doSomething(clientName.someMethod);

...因为doSomething不知道将哪个对象用作this

您可以使用Function#bind

进行修复
doSomething(clientName.someMethod.bind(clientName));

或类似地:

var f = clientName.someMethod.bind(clientName);
f();

Function#bind创建一个新函数,在调用时,将调用原始函数,并将this设置为您提供的参数。

只是为了充实我上面的ES6评论:在ES6中,如果你有:

function Client(){
   this.services = {
      'propertyName' : {}
   };
   this.someMethod = () => {                  // <== ES6 "arrow" function
       if (this.services['propertyName']) {
           //do something
       }
   }
}

...如何调用someMethodthis将是创建的功能。五,方便。 : - )