创建永不丢失绑定的方法

时间:2019-04-22 11:22:51

标签: javascript this custom-element

请考虑以下基本自定义元素:

class XElement extends HTMLElement {
  constructor() { super(); }
  foo() { console.log( this ); }
} customElements.define( 'x-element', XElement );

问题出在这里

const xelem = new XElement();

/* `foo` will lose its binding to `xelem`:
*/ someButton.onclick = xelem.foo;

// These will work, but it's too verbose:
someButton.onclick = () => xelem.foo();
someButton.onclick = xelem.foo.bind( xelem );

我只看到一种解决方案,就是在构造函数中添加foo作为箭头函数,但是在我看来这是错误的。

constructor() {
  super();
  this.foo = () => console.log( this );
}

有什么正确的方法可以创建永远不会失去其绑定力的方法?

2 个答案:

答案 0 :(得分:6)

这就是JavaScript this绑定的工作方式。

您可以阅读以下内容:THIS (YDKJS) 基本上,函数内this的值取决于该函数的调用方式。因此,您需要使用bind()方法或将this定义为箭头函数(箭头函数按词法绑定其上下文),将foo值显式地硬绑定到函数foo。 >

所以解决方案就是您找到的。

您可以这样做:

在您的构造函数中:

class XElement extends HTMLElement {
  constructor() { 
   super(); 
   this.foo = this.foo.bind(this);   
  }
  foo() { console.log( this ); }
}

或者(我不喜欢这个)

class XElement extends HTMLElement {
  constructor() { 
   super(); 
   this.foo = () => console.log(this);   
  }
}

class XElement extends HTMLElement {
  constructor() { super(); }
  foo = () => { console.log( this ); }
}

答案 1 :(得分:0)

这里是定义也可以使用的不可绑定方法的另一种变体:

class XElement extends HTMLElement {
  constructor() { super(); }

  foo = (function() {
    console.log( this );
  }).bind( this )
}