使用 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。解决了
我尝试使用 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。解决了