语境"这"没有保留对象方法

时间:2016-04-06 11:08:24

标签: javascript ecmascript-6

我相信(可能是我错了)ECMA6的方法定义使用箭头功能(内部)和"这个" (背景)必须保留。 但

class Foo {
    methodOne() {
        console.log("MethodOne is called")
    }

    methodTwo() {
        console.log("MethodTwo is called");
        this.methodOne();
    }
}

var foo = new Foo();

var executing = function (someMethod) {someMethod()};

executing(foo.methodTwo)

它引发了错误" Uncaught TypeError:无法读取属性' methodOne'未定义的(...)"

那么,要么我理解规格不正确,要么浏览器(Chrome,FF)和nodejs不支持这个?

2 个答案:

答案 0 :(得分:3)

ES6中的类只是原型继承的语法糖。这样,类中的方法声明将附加到prototype对象。

1)示例中的问题在于调用函数的方式。要保留上下文this,您仍需要将其作为对象上的方法调用

var foo = new Foo();

var executing = function (someMethod, context) {someMethod.apply(context)};

executing(foo.methodTwo, context);

2)但是如果您将其作为常规功能调用,那么您将在严格模式下将其设为undefined

 methodTwo() {
        console.log("MethodTwo is called");
        this.methodOne(); // <---- `this` is `undefined`
 }
函数调用中的

this由其调用方式决定:

  1. 作为常规函数(将this设为undefined或非严格模式下的全局对象):someMethod();var m = foo.methodTwo; m();
  2. 作为对象上的方法(使this成为对象):foo.methodTwo()
  3. 作为构造函数(使this成为新创建的对象):new Foo()
  4. 间接调用(使用apply(newContext)call(newContext)):someMethod.apply(context)
  5. 请注意bound()方法可以在调用之前修改上下文。对于情况1,2和4,它将取消对调用的任何后续上下文修改。对于构造函数调用,将忽略绑定上下文并仍使用新创建的对象。

    在JavaScript中检查this nice post有关函数上下文和调用的信息。

答案 1 :(得分:1)

  

那么,要么我理解规格不正确,要么浏览器(Chrome,FF)和nodejs不支持这个?

无论你阅读哪个规范,你都误解了它。方法和箭头函数是两个不同的东西,即使方法具有箭头函数语义,你也不会得到你期望的行为(因为箭头函数在词法上解析this)。

不,方法像普通函数声明/表达式一样工作到this

另见How to access the correct `this` context inside a callback?