使用 ES6 的 Class 功能时,无法访问 JavaScript 成员方法中的字段

Cannot access field in member method in JavaScript when use Class feature of ES6

我尝试使用 ES6 中的特性 Class。我初始化了一个对象 A,它有一个字段 B 和成员函数 C,但是当我尝试访问 C 中的 B 时,控制台说 C 是未定义的。代码如下所示。

一个代码块

extension = new IcpSdkExtensionBase();
device = new IcpSdkDeviceBase();
eventsBack = new IcpSdkEventsBackBase();
proxy = new IcpProxy(device, eventsBack, extension, 'ws://127.0.0.1:56789/IcpConsole');

function login() {
    console.log(eventsBack);
    eventsBack.OnUnifiedLogoutResult(0, 0, 0);   
}

B码块

'use strict';

class IcpSdkEventsBackBase {


    constructor(eventsBacks, name) {
        this.eventsBacks = [];
        if (arguments.length === 0) {
            console.log(this);
            return this;
        }

        for (let key in arguments) {
            if (!(arguments.hasOwnProperty(key))) {
                continue;
            }
            if (!(arguments[key] instanceof IcpSdkEventsBackBase)) {
                continue;
            }
            this.eventsBacks.add(arguments[key]);
        }
        return this;

    }


    OnUnifiedLogoutResult(callId, flag, errorCode) {
        console.log(this);
        console.log(typeof (this));      
        console.log(this.eventsBacks);
        this.eventsBacks.forEach(p => {
           p.OnUnifiedLogoutResult(callId, flag, errorCode);
    });
}

}

并且在Chrome控制台中,有如下代码块日志,证明eventsBack不是undefined。

IcpSdkEventsBackBase {eventsBacks: Array(0)}

但是B代码块日志如下

    undefined
    undefined
    icp-sdk-events-back-base.js:37 undefined
    icp-sdk-events-back-base.js:38 Uncaught TypeError: Cannot read property 'eventsBacks' of undefined
        at OnUnifiedLogoutResult (icp-sdk-events-back-base.js:38)
        at IcpSdkEventsBackBase.<anonymous> (icp-proxy.js:83)
        at login (icp-console-demo.js:11)
        at HTMLInputElement.onclick (icp-console-demo.html:29)

B代码块的log有问题。因为我已经新建了一个对象,并且在 A 中阻止了它 正确记录,但在 B 代码块中,它说 this 未定义。

终于找到问题了。 这个代码片段 proxy = new IcpProxy(device, eventsBack, extension, 'ws://127.0.0.1:56789/IcpConsole');

这行我用的是动态代理,是通过Aspect实现的,但是不对,会导致方法丢失原来的对象,所以我把代理改成ES6中的Proxy。解决了