在窗口全局中无法访问Javascript ES6类定义
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在窗口全局中无法访问Javascript ES6类定义,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2722字,纯文字阅读大概需要4分钟。
内容图文
我遇到了一个有趣的问题,至少我觉得它很有趣,而且有点烦人.我有一节课,对于这个问题,我会保持非常简单……
class Foo {
static pageChange() {
console.log('The page changed');
}
}
现在,我可以通过Foo.pageChange()访问它没问题,一切都按预期工作.当我尝试动态访问它时,困难的部分和有趣的位进来.
我有一个单独的对象监视事件并处理根据需要调度它们.这与Google可视化库有关,我在其中有一个表,并且表中包含与之关联的事件.我有一个对象负责从PHP输出创建所有这些.它只是一个系统,简单的解释你可以在PHP中做这样的事情……
GoogleVisLibrary::renderChart(
array(
'chartType' => 'table',
'chartData' => $this->chartData,
'chartOptions' => $this-chartOptions,
'events' => array(
'sort' => 'Foo.pageChange'
)
);
现在,这将创建表和所有好东西.问题是在javascript中访问Foo类中的静态方法.在创建Foo之前??我所拥有的就是这个.
var Foo = {
pageChange: function() {
console.log('page changed');
}
}
然后在我的事件库处理程序thingy它会看起来像这样..
for(var i = 0, l = events.length; i < l; i++) {
window[events.className][events.fnName].apply();
}
这样可以正常工作,因为可以通过窗口[‘Foo’]访问Foo
但是当你使用第一个代码片段中显示的类定义时,你不能再从超全局窗口访问它,它只输出’undefined’.
那么,有没有办法通过动态引用来访问类中的静态方法,就像通过全局窗口的Foo对象一样?
我希望这是有道理的,我正在解释它.如果没有任何意义,请随意提问,我会尽力解释.提前感谢您提供任何帮助.
解决方法:
要获得对窗口对象的引用,您需要明确地执行此操作:
window.Foo = class Foo { ... }
在this answer中阅读更多关于不是窗口对象属性的类,这也引用了ECMA2015 Specification, Section 8.1.1.4: Global Environment Records:
A global Environment Record is logically a single record but it is specified as a composite encapsulating an object Environment Record and a declarative Environment Record. The object Environment Record has as its base object the global object of the associated Realm. This global object is the value returned by the global Environment Record’s GetThisBinding concrete method. (E.g., the global object referenced by
window
on browsers — T.J.) The object Environment Record component of a global Environment Record contains the bindings for all built-in globals (clause 18) and all bindings introduced by a FunctionDeclaration, GeneratorDeclaration, or VariableStatement contained in global code. The bindings for all other ECMAScript declarations in global code are contained in the declarative Environment Record component of the global Environment Record.
使用专用对象
最好不要为此使用全局对象,并将特定对象专用于包含您的类并将事件管理库基于该对象,如此简化代码段所示:
(function () {
var classes = {
Foo: class Foo {
static pageChange() {
console.log('The page changed');
}
}
}
/////////////
var events = [{
className: 'Foo',
fnName: 'pageChange'
}];
for(var event of events) {
classes[event.className][event.fnName].apply();
}
}());
内容总结
以上是互联网集市为您收集整理的在窗口全局中无法访问Javascript ES6类定义全部内容,希望文章能够帮你解决在窗口全局中无法访问Javascript ES6类定义所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。