问题标签 [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 回答
1268 浏览

javascript - ECMAScript 中的对象属性常量?

我已经看到了一些关于 ECMAScript Harmony 的建议,即能够使用关键字指定常量const。但是,它似乎只在块作用域(即FunctionBodyProgram)中可用。有没有办法将常量定义为对象属性(想象myObj.STATUS_OK)?

我想建议的方法是使用propertiesvia Object.definePropert(y/ies),但这似乎不是很方便,是吗?

0 投票
8 回答
19215 浏览

javascript - ECMAScript:Harmony / ES6 到 JavaScript 编译器

在阅读了 Peter 关于 JavaScript 的文章后,我注意到

Brendan Eich 表示,Harmony 的目标之一是成为 JavaScript 编译器的更好目标。

目前有两种流行的编译器,它们的ES:Harmony合规性有些模糊:

尽管 CoffeeScript 有一些合规性,但它并不是为 ES:Harmony 编译器而设计的,因此它对此没有用处。

Tracuer 似乎更严格地遵守 ES:Harmony 规范,但我不知道它是否打算成为一个完整的 ES:Harmony 编译器。

由于目标是将 ES6 编译为 ES3,因此还需要支持 ES5 功能(并且可能需要切换是将 ES5 编译为 ES3 还是将 ES6 编译为 ES3)。

  1. 目前是否还有其他项目旨在创建完整的 ES:Harmony to ES3 编译器?
  2. 知道标准是年轻/不稳定/不断变化的,开始编写这样的编译器是否明智。
  3. 当前是否有任何 ES5 -> ES3 编译器?

我在Traceur 邮件列表上留下了一个问题。

这种编译器的目标是向后兼容 ES3。没有在 ES3 中完全模拟 ES5 和 ES6。

0 投票
2 回答
1144 浏览

javascript - Javascript 代理:节点代理、Harmony、带有魔法 getter 和 setter 的混合对象……在 Coffeescript 中?

我想要一个带有方法和私有变量的代理对象。

也就是说,所有正常的对象属性:

有一些原型:

其中枚举跳过私有变量/函数:

并且 get/set 将通过一个神奇的 getter/setter 运行:

到目前为止,我有这个使用节点代理的 hokey Coffeescript。有更好的答案吗?

生产

0 投票
1 回答
440 浏览

javascript - 为什么我不能在nowjs中扩展每个人的口袋?

我正在尝试在pocketnowjs 的每个人中提供功能。我想_.extend通过每个人的口袋来做到这一点,即everyone.now。由于某种我无法理解的原因,_.extend未能在客户端正确提供该功能。

这是我当前的代码:

在服务器端和客户端,我都可以做得now.foo()很好。另一方面,now.bar()因为now.bar未定义而失败。客户端和服务器端都是这种情况。我试图在服务器端检查是否存在,如上最后一行所示。但是,此行记录undefined.

Underscore 的extend功能(显然)确实适用于其他对象,所以我猜它与 nowjs 使用的“神奇名称空间”有关。

为什么扩展不起作用,everyone.now我怎样才能让它起作用?


编辑2:我对代理进行了更多研究。似乎通过传递变量名称来设置代理上的属性不起作用。我删除了我的第一个编辑,因为这个测试用例更加缩小了。

为什么这不起作用?这是一个错误吗?(大多数时候我自己问这个我知道不是,但这真的让我一无所知......)

日志结果:

显然,proxy[ key ] = "bar";不会导致set在代理上被调用。这是为什么?

0 投票
2 回答
1847 浏览

javascript - 如何检查/迭代节点中的对象?

在我将对象字符串化并将其发送给客户端之前,我从 mongoose 查询中得到了一个结果(对象)并想要替换/删除一些键。

当我 console.log 对象时,一切都很好(列出了所有键,仅此而已)。当我在对象上执行 for..in 时,隐藏字段会突然弹出(而感兴趣的键,不要)。它们是有道理的——它们属于猫鼬——但我不想要它们。在对象上使用 Object.keys 或 Object.getOwnPropertyNames 时也会发生同样的事情 - 隐藏字段弹出窗口,没有用处。

所以我想用 util.inspect(obj,true,null,true) 检查元素并将结果记录到控制台。控制台上的结果是一样的,就好像我在没有检查的情况下直接 console.logged 对象一样。

现在,两个问题;

  1. 如何正确检查对象,以便我真正获得有关该对象的内部/隐藏信息?
  2. 如何遍历对象并仅获取字段?(是的,我正在 for..in 循环中进行 hasOwnProperty 检查)

//编辑

好,我知道了。经过一番调查,我意识到 mongoose 对象代理了它的属性并且有一个 toJSON 函数,这就解释了为什么 console.logs 在预期的输出结构中。解决方法是使用 Mongoose 自己的 toObject 方法;

这样,我可以遍历 Object.getOwnPropertyNames 并替换/删除我不想让客户知道的键!

0 投票
3 回答
3465 浏览

javascript - 更改对象原型以更改 instanceof 结果的好方法?

我想评论这个老问题,但它似乎被锁定了。

这是我的用例:

  1. obj使用构造函数创建一个对象Baseobj instanceof Base返回真。
  2. 我想改变它的原型obj,使它看起来好像obj是从Derived. 也就是说,我要
    • obj访问方法Derived
    • obj instanceof Derived返回真

原因是obj层次结构中有一个类型,该类型在创建时是未知的,并由之后发生的事情决定。我希望能够将它移到层次结构中。

我相信我可以做到这一点

obj.__proto__ = Derived.prototype;

__proto__将在下一版本的 JavaScript 中弃用。自从我上面链接的问题被问到后,代理API 发生了变化,似乎不支持我的用例。

我的用例是否有替代实现现在存在或计划在未来实现?

我现在能看到的唯一选择是使用

并且永远不要存储对 obj 的多个引用,但这样的代价是相当不便的。

这是一个演示这个问题的小提琴。

0 投票
5 回答
4376 浏览

javascript - 如何在 JavaScript 中使用五位长的 Unicode 字符

在 JavaScript 中,我可以这样做:

但我不能这样做

它将被解释为“\u1D15”后跟“D”

有什么解决方法吗?

2012-07-09 更新:ECMAScript Harmony 提案现在包括对所有 Unicode 字符的支持。

0 投票
5 回答
12446 浏览

node.js - 在 nodejs 中启用 Harmony 代理

是否可以在 nodejs 中启用 EcmaScript 6 Harmony 代理?如果是这样,有什么优点和缺点?有没有关于如何使用它们的文档?谢谢 !

0 投票
2 回答
1081 浏览

node.js - ES6 代理无法拦截数组索引

这是我的测试代码(使用node --harmony-proxies foo.js

为什么最后两行无法打印 5,为什么代理无法拦截看起来像整数的属性?它是一个实现错误还是它是如何指定的?是否有单独的方法来拦截数组索引,以便我可以实现自己的数组(例如稀疏数组)?

0 投票
1 回答
4060 浏览

javascript - Javascript:在各种浏览器中是否有与 caniuse.com 等效的 HTML5 API/ECMAScript5/ECMAScript6?

在各种浏览器中是否有与 caniuse.com 等效的 HTML5 API/ECMAScript5/ECMAScript6?

caniuse.com 确实有一些 javascript 覆盖,但是像http://caniuse.com/#feat=filesystem这样的页面并没有真正告诉你除了 yes/no/partially 之外的任何内容。实际上,我正在寻找类似 quirksmode 与 caniuse 交叉的东西,在那里我可以详细查看任何 API 或方法,并查看它当前在哪里实现(并且没有错误)。例如,一个网站,我可以查看哪些浏览器的哪些版本当前可以使用它: