Tag: ecmascript 5

JavaScript中的原型OO

TL; DR: 我们是否需要原型OO中的工厂/构造器? 我们可以做一个范例转换并完全放弃它们吗? BackStory: 我最近一直在做JavaScript中的原型OO,并发现在JavaScript中执行的面向对象的99%迫使经典的OO模式。 我认为原型OO是两件事。 方法的静态原型(和静态数据)和数据绑定。 我们不需要工厂或build设者。 在JavaScript中,这些是包含函数和Object.create Object文字。 这意味着我们可以将所有东西都build模为一个静态的蓝图/原型和一个数据绑定抽象,这个抽象最好直接插入到文档样式的数据库中。 即从数据库中取出对象,并通过数据克隆原型来创build对象。 这将意味着没有构造逻辑,没有工厂,没有new 。 示例代码: 一个伪示例是: var Entity = Object.create(EventEmitter, { addComponent: { value: function _addComponent(component) { if (this[component.type] !== undefined) { this.removeComponent(this[component.type]); } _.each(_.functions(component), (function _bind(f) { component[f] = component[f].bind(this); }).bind(this)); component.bindEvents(); Object.defineProperty(this, component.type, { value: component, configurable: true }); this.emit("component:add", this, component); […]

你什么时候使用Object.defineProperty()

我想知道什么时候该用 Object.defineProperty 为对象创build新的属性。 我知道,我可以设置的东西 enumerable: false 但是你什么时候需要这个呢? 如果你只是设置一个属性 myObject.myprop = 5; 其描述符都设置为true,对吗? 实际上,当你们对.defineProperty()进行冗长的调用以及出于什么原因时,我更加好奇。

一个函数比一个数组大?

我的一个朋友在一些Javascript代码中发现了一些有趣的行为,我决定进一步调查。 比较 (function (x) {return x*x;}) > [1,2,3] 在大多数主stream浏览器(Firefox,Chrome,Opera和Safari)中返回true ,在IE9中返回false 。 对我来说,这个比较没有任何逻辑结果,因为没有办法说函数大于数组。 在ECMA脚本标准中读到这一点,它说在对象上使用时的实际参数是对参数调用ToNumber内部操作的结果。 一些实验和进一步的阅读告诉我,这与应用(Number) arg类的types转换不同。 阅读规范,我很难弄清楚这里发生了什么。 任何人都可以填写我在这里发生了什么?

有没有办法检查严格模式是否被强制执行?

有没有办法检查是否严格模式使用严格执行,我们要执行不同的代码严格模式和其他代码非严格模式。 寻找像isStrictMode();//boolean

任何性能都有利于“locking”JavaScript对象?

JavaScript 1.8.5(ECMAScript 5)增加了一些有趣的方法, 可以通过不同程度的彻底性来防止对传递对象的未来修改 : Object.preventExtensions(obj) Object.seal(obj) Object.freeze(obj) 大概这些的主要观点是要发现错误:如果你知道你不想在某个点之后修改一个对象,那么你可以locking它,这样如果你以后不经意修改它,就会抛出一个错误。 (如果你已经完成了"use strict";那就是)。 我的问题:在V8等现代JS引擎中,使用上述方法locking对象是否有任何性能优势(例如,更快的属性查找,减less的内存占用)? (另见John Resig的很好的解释 – 虽然没有提到性能。)

我可以禁用特定function的ECMAscript严格模式吗?

在MDC或ECMAscript规范中,我没有发现任何关于我的问题。 也许有人知道一个更“黑客”的方式来解决这个问题。 我在我的环境中调用每个JavaScript文件的"use strict" 。 我的所有文件都是这样开始的 (function(win, doc, undef) { "use strict"; // code & functions }(window, window.document)); 现在,我有一个处理错误的自定义函数。 该函数使用.caller属性来提供上下文堆栈跟踪 。 看起来像这样: var chain = (function() { var _parent = _error, _ret = ''; while( _parent.caller ) { _ret += ' -> ' + _parent.caller.name; _parent = _parent.caller; } return _ret; }()); 当然,在严格模式下.caller是一个不可删除的道具,当检索时会抛出。 所以我的问题是,有没有人知道如何禁用更严格的“function明智”? "use […]

以严格模式间接评估

我了解eval()如何在非严格的上下文中工作,但在严格模式下使用eval()的情况已经完全困惑了我。 当在全局范围中直接调用eval() ,variables将保留在新的eval()范围内: 'use strict'; eval('var a = 1;'); console.log(a); // ReferenceError: a is not defined 但是,如果我在全局范围内对eval()进行间接调用(应该是相同的东西,对吗?),它的行为好像不是严格模式(如果您不相信我,请参阅此JSFiddle ) : 'use strict'; (0, eval)('var a = 1;'); // indirect call to eval console.log(a); // 1??? 如果你不明白什么(0, eval) ,请参阅谷歌主页为什么使用(0,obj.func)(args)语法? 。 至less根据我对eval()应该如何在严格模式下工作的理解,意思是(无论是直接还是间接调用eval()为eval()调用中定义的variables创build一个新的作用域,然而这似乎并不是这种情况。 规范说明如下: 10.4.2input评估代码 当控制进入eval代码的执行上下文时,执行以下步骤: 如果没有调用上下文,或者如果eval代码没有被直接调用( 15.1.2.1.1 )评估到eval函数,那么, 一个。 如10.4.1.1所述,使用eval代码作为C初始化执行上下文,就好像它是全局执行上下文一样。 其他, 一个。 将ThisBinding设置为与调用执行上下文的ThisBinding相同的值。 湾 将LexicalEnvironment设置为与调用执行上下文的LexicalEnvironment相同的值。 C。 将VariableEnvironment设置为与调用执行上下文的VariableEnvironment相同的值。 如果eval代码是严格的代码 […]

为什么019不是JavaScript语法错误? 或者为什么是019> 020

如果我在JavaScript控制台中input019 > 020 (在Chrome和Firefox中都testing过),我的答案是true 。 这是由于020被解释为OctalIntegerLiteral (等于16 ),而019显然被解释为DecimalLiteral (和等于19 )。 当19大于16 , 019 > 020为true 。 令我感到困惑的是为什么019被解释为DecimalLiteral 。 是哪个生产? DecimalIntegerLiteral不允许019 : DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits_opt OctalIntegerLiteral也不允许019 (因为9不是八进制数字): OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 所以从我在规范中看到的019实际上应该被拒绝,我不明白为什么它被解释为一个十进制整数。 我想这里有一些兼容性规则,但是我没有find一个正式的定义。 可以请任何人帮助我呢? (为什么我需要这个:我正在用JavaCC为Java开发一个JavaScript / ECMAScriptparsing器,并且必须特别注意规范及其偏差。)

如何用Traceur实现ES6类中的私有方法

我现在使用Traceur编译器来使用ES6function。 我想从ES5实现这个东西: function Animal() { var self = this, sayHi; sayHi = function() { self.hi(); }; this.hi = function() {/* … */} } 目前traceur不支持private和public关键字( 来自和谐 )。 而ES6类语法不允许在类体中使用简单的var (或let )语句。 我发现的唯一方法是在类声明之前模拟私有。 就像是: var sayHi = function() { // … do stuff }; class Animal { … 如果不出意料的话,不如预期的那样,如果没有每次apply或bind它,都不能将其正确地传递给私有方法。 那么,有没有可能在与traceur编译器兼容的ES6类中使用私有数据呢?

Javascript中冻结和密封的区别

我刚刚听说JavaScript方法freeze和seal ,可用于使任何对象不可变。 这里有一个简单的例子来说明如何使用它: var o1 = {}, o2 = {}; Object.freeze(o2); o1["a"] = "worked"; o2["a"] = "worked"; alert(o1["a"]); //prints "worked" alert(o2["a"]); //prints "undefined" 这些方法有什么区别,它们可以提高性能吗?