问题标签 [ecmascript-harmony]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2009 浏览

javascript - ECMAScript 6 中全局范围内的 `this`

我自己尝试过查看 ES6 草案,但我不确定在哪里查看:

有人可以告诉我this在 ES6 中是否一定指的是全局对象?此外,该对象是否具有与全局范围相同的成员?

如果你能回答 ES5,那也会很有帮助。

我知道this在全局范围内是指浏览器和大多数其他 ES 环境中的全局对象,例如 Node.js。我只想知道这是规范定义的行为,还是实现者添加的扩展行为(以及这种行为是否会在 ES6 实现中继续存在)。此外,全局对象是否总是与全局范围相同?还是有区别?


更新 - 为什么我想知道:我基本上是想弄清楚如何在 ES5 和 6 中可靠地获取全局对象。我不能依赖,window因为那是特定于浏览器的,我也不能依赖,global因为那是特定于环境的像节点。我知道thisNode 可以module在模块范围内引用,但我认为它仍然是global在全局范围内引用。我想要一种跨环境的 ES5 & 6 兼容方式来获取全局对象(如果可能的话)。似乎在我所知道的this全局范围内的所有环境中都这样做,但我想知道它是否是实际规范的一部分(并且在我可能不熟悉的任何环境中都如此可靠)。

我还需要知道规范中的全局范围和全局对象是否相同。换句话说,全局范围内的所有变量都与globalobject.variable_name?


更新 2 - 我正在尝试做的事情:

为 ES5 环境开发了一些 ES6 垫片。我想知道 (1) 检查 ES6 内置插件是否已经存在,以便在可能的情况下可以使用它们而不是我的垫片,以及 (2) 如果内置 - ins 尚不存在。

目前我正在遵循这种模式:

(1) 还有其他一些可能性,但归根结底,我需要一种方法来在全局范围内添加一些东西而不var在全局范围内使用(因为在我检查它们之前会覆盖内置函数,因为var提升 [至少在幼稚的情况下,也许我也可以间接eval声明var?])。我希望我的代码能够在严格模式下运行,从而使问题更加复杂。

我发现,根据 ES5 规范,间接eval执行全局范围内的代码。所以我至少能够做到这一点。我的问题是,如果我进入this全局范围,(1)检查该对象的属性是否会让我知道全局范围中是否已经存在内置?(2) 向该对象添加属性是否允许我将变量添加到全局范围?

0 投票
1 回答
1251 浏览

javascript - Ember.js 对象观察者是否等同于 ES6 Harmony Object.observe?

看着对象内部的新观察 ES6 功能,我想知道 Ember 和 ES6 是等价的还是不同的?我们可以在 ember 中安全地使用Watchjs polyfill吗?

0 投票
1 回答
1728 浏览

node.js - 如何在 Coffeescript 中实现和谐?

这是我运行我的js代码的方式:

现在我想转向 CoffeeScript。所以我尝试这样运行它:

它失败了。我怎样才能通过这个--harmony选项?

0 投票
1 回答
932 浏览

javascript - ES6:公共符号与私有符号

我一直在寻找有关如何在 ECMAScript 6 中将符号指定为公共或私有的讨论。

据我了解,将使用类似于以下的模式创建私有符号:

但是我如何将items符号指定为公共?在 ES6 中是否可以使用公共符号,或者它们只是私有的(Object.getOwnPropertyNames例如不显示)?此外,默认情况下公共符号是否可枚举(显示在 中Object.keys)?

任何人都可以将我链接到相关信息吗?

0 投票
1 回答
135 浏览

javascript - 如何在 ES.Next 中编写库

我已经阅读了很多关于 ES.Next 的内容,并且对 ES.Next 模块有疑问。在这段时间里,所有 JavaScript 程序员都在匿名函数中编写 JavaScript 库。像 jQuery 的东西:

下划线:

但是当 JavaScript 获得模块时,一切会发生怎样的变化呢?

或者模块也需要写匿名函数?全局变量呢?当 ES.Next 出现时,所有 JavaScript 编码风格如何变化?

0 投票
1 回答
1873 浏览

javascript - JavaScript 中的动态服务定位器?

我正在尝试使用 Harmony Proxies (Node.js) 用 Ja​​vaScript 编写动态服务定位器。基本上你会创建一个新容器:

然后,您将能够像传统的服务定位器一样设置和获取值:

你甚至可以拥有像子对象一样的命名空间:

问题在于动态别名。

创建别名时,它会创建一个新的代理对象,您可以在其中像传统对象一样操作它,但它是get()set()方法的别名。

代替:

使用别名,您将使用:

问题在于深层命名空间。假设您正在尝试访问App.Hello.World.Controller,因为它一次通过代理一个名称空间,而不是一次全部(就像那个完整的名称空间)。我如何知道用户是否正在调用App.Hello以检索存储在服务定位器中的值,或者用户是否想继续访问更深的命名空间?你不能(根据我的尝试)。

你还有什么其他方法可以做到这一点?

App.Hello.World如果要访问更深的名称空间,则具有将返回代理或存储在服务定位器中的值的语法。

现在,我已经制定了处理这两个选项的约定。您将使用单数名称来检索值和复数来返回代理。这只是一个快速的“破解”,因为它不是很有效。

(如果您需要澄清或更多信息,请告诉我)

0 投票
1 回答
422 浏览

javascript - CoffeeScript 类和 nosuchmethod

假设在底层 Javascript 引擎中存在Harmony 代理,如何构造一个 CoffeeScript 超类,以便扩展它允许一个类定义一个 noSuchMethod 方法(或 methodMessing)?

如果类(或其超类)没有请求的方法,则将使用名称和参数列表调用该方法。

0 投票
2 回答
332 浏览

javascript - 扩展常规对象以支持 ES5 数组功能的问题

很久以前,我一直愿意完全模糊原生数组和常规对象之间的界限,不仅扩展了与 ES5 中的数组相同的功能,而且在双方都捆绑了我的自定义方法包。

几个聪明人想到了这些范式变化。就像 Angus Croll 在文章javascript-object-keys-finally中提到的那样:

“此外,随着数组和常规对象之间的界限模糊(在自定义 getter 和 setter 的帮助下),我们很可能会看到通用的“类数组”对象的增长,它们享有两全其美——非数字标识符和访问由 Array.prototype 定义的丰富的 API 集。EcmaScript 5 通过引入由一种类型定义但可供任何类型使用的泛型方法显然抢先了这一趋势。”

一路上,他得到了文章中的编码: extending-objects-with-javascript-getters

这种方法对我来说非常有趣。但是,它似乎也遇到了一些严重的问题!

  1. 用几个新属性扩展原始 myObj 模型怎么样?我们是否应该extendAsArray在每个属性更改上运行以更新它的相关length属性?

  2. 当属性发生变化时,相关的不仅仅是length属性;数组索引也应该更新,因为类似数组的属性请求肯定是未定义的。所以当

    然后

    /li>

我已经相应地修改了 Angus 的代码,因此它支持根据length请求自动更新属性:

length问题是:当一个属性被改变、添加或删除时,我们如何更新对象的数组索引及其属性?

我应该使用Object.watch吗?

还有一个未解决的问题:如何干扰我自己的未填充实用程序库,并以一致的方式使其也适用于对象?

我对两种类型都使用相同的代码库:z.Object({}).mapEveryz.Object([]).mapEvery

请避免提及 JQuery 和下划线。我已经为这两种类型提供了一个全面的自定义方法列表,我愿意使用可能与我未填充的标准一起完成的标准,我不愿意重构它!

0 投票
7 回答
34887 浏览

javascript - ES6 Map 和 WeakMap 有什么区别?

查看这个这个MDN 页面,似乎 Maps 和 WeakMaps 之间的唯一区别是 WeakMaps 缺少“大小”属性。但这是真的吗?他们之间有什么区别?

0 投票
2 回答
2879 浏览

javascript - 使用经典继承构造代理对象的 JavaScript 模式

虽然尚未最终确定,但我正在尝试使用 ES6 代理。我的目标是拥有一个构造函数(一个利用如下所示的经典继承的函数)来创建具有继承链的代理对象。

以下看起来合理吗?我创建一个项目并从构造函数返回代理。任何将返回对实例的引用(出于链接目的)的方法都必须返回对代理的引用,否则在链接时我们会丢失代理。

目标是构造可能是经典继承链产物的代理对象(通过'new'关键字)。

下一期。考虑一下如果我用 Backbone.Events 扩展我的 Item 原型会发生什么。那些导入的方法将返回this而不是this.proxy. 为了解决这个问题,我必须包装所有返回的导入方法this以便返回proxy。这似乎很痛苦且容易出错。使用 Proxy 抽象涉及大量布线,这对我来说似乎不太正确。

虽然我喜欢代理概念,但我关心它的实用性。也许我错过了一些更好的实践来实现我的目标?

编辑:

这个例子过于简单,因此无法描述我为什么需要它。

最终,我使用代理的目标是允许多重继承。我希望能够将多个行为(模块)混合到给定的代理对象中。我还希望能够简单地随心所欲地分解行为。

通过使用代理,我可以让 Proxy 对象管理对方法的访问,并根据需要将信息传递给 mixins。基本上,这允许改进面向方面的编程。对于一个方面,我通常会包装和替换一个函数。有时,给定的方法会被多个方面包装和重新包装。AOP 的问题在于,一旦您以这种方式修改了一个对象,就很难仅删除一个方面,因为该方面可能已被重新包装所掩埋。

代理不会遇到这个问题。你的 mixin 可以改为放在一个数组中。代理处理对这些 mixin 中的方法的分派(甚至是多个方法,因此是多重继承)。然后,取消混合行为就像从该数组中删除一个 mixin 一样简单。

代理的问题在于,虽然方法返回对对象本身的引用是一种常见做法(出于链接目的),但您并不真正希望任何原始方法返回对该对象的引用(因此绕过代理),您希望返回代理。