出于某种原因,我在es6课上给“这个”取了个奇怪的值...
null
js prettyprint-override">'use strict';
class Clicker {
constructor(element) {
this.count = 0;
this.elem = element;
this.elem.addEventListener('click', this.click);
// logs Clicker { count:0, elem: button#thing} as expected
console.log(this);
}
click() {
// logs <button id="thing">...</button> as unexpected...
console.log(this);
this.count++;
}
}
var thing = document.getElementById('thing');
var instance = new Clicker(thing);
<button id="thing">Click me</button>
null
为什么clickers的click方法中的“this”指的是dom节点而不是...本身?
更重要的是,如果我不能使用“this”来做的话,我如何从它的click方法中引用clickers的count属性?
为什么clickers的click方法中的“this”指的是dom节点而不是...本身?
因为.addeVentListener()
的规范是将this
指针设置为捕获事件的DOM元素。这就是它的工作原理。
当将方法作为要重写this
值的回调传递时,可以使用.bind()
强制使用this
的所需值:
this.elem.addEventListener('click', this.click.bind(this));
说明:
Javascript中的所有函数调用都根据函数的调用方式设置this
的新值。有关该基本规则集的进一步信息,请参阅本说明。
最重要的是,当你这样做时:
this.elem.addEventListener('click', this.click);
您只是获得this.click
方法,并将该方法单独传递给AddEventListener()
。this
的值将完全丢失。就好像你在这样做:
var m = this.click; // m here is just a reference to Clicker.prototype.click
this.elem.addEventListener('click', m);
在此基础上,.addeVentListener()
被专门构建为在调用回调时设置自己的this
值(将this
指向创建事件的元素)。
因此,您可以使用.bind()
,如上图所示,在调用方法时强制this
的正确值。
作为参考,您可能会发现在Javascript中为函数调用设置this
的六种方式的描述非常有用。
其他选项
我发现.bind()
是定义这一点的最清楚的方法,但您也可以使用本地匿名函数:
var self = this;
this.elem.addEventListener('click', function() {
self.click();
});
或在ES6中,箭头函数:
this.elem.addEventListener('click', () => this.click());
箭头函数将自动为您保留this
的值,以避免需要前面示例中使用的self
引用。
问题内容: class App extends Component { constructor(props) { … } 在类中声明的两种函数 (onChange和onSubmit) 之间有什么区别?如果我将其声明为ES6类方法,但在 const url中 引用this.sate时出现错误,但是将其更改为arrow函数可以解决此问题。 我想知道两种情况下如何正确处理“ this” 另外,我该如何做
在这个es6脚本中,click事件不起作用,因为方法是用( )作为 调用的。 如何将一个事件关联到一个方法而不松散作用域? 匿名用户 这是一个常见的JS问题,但其核心是 无异于 您正在将函数作为事件处理程序传递,但没有确保在调用时将设置为所需的值。在ES5中实现这一点的最简单的方法是 或在ES6中,使用箭头函数: 但是请注意,这两种解决方案都将破坏中的逻辑(已经稍微破坏了),因为 您不再有任何对附
玩一些es6,遇到了一个问题,我不知道如何解决 在的内部,?目前我用bind解决了这个问题,但我想知道是否有一种更“合适”的ES6方法来实现这一点。
问题内容: 考虑到这一节课;我将如何迭代其中包含的方法? 我尝试过的以下操作均未成功: 问题答案: 您可以在原型上使用Object.getOwnPropertyNames:
这里的this指的是Toppings类的一个实例。 只要使用点号调用list方法,如myToppings.list(),则this.formatToppings(this.toppings)调用在类的实例上定义的formatToppings()方法。 这也将确保formatToppings内部,this指的是同一个实例。 但是,this也可以指其他东西。有两种基本情况你应该记住。 方法调用:
我正在尝试创建一个简单的国际象棋程序,我遇到了一个小问题,当执行典当推广。我有一个抽象的类片和6个类(国王,皇后,鲁克,骑士,主教和卒)扩展它。所以当一个棋子到达棋盘的另一端时,我想让他变成皇后。 我想知道是否有更好的方法来做这件事。以某种方式从“内部”更改对象的类。