问题标签 [ecmascript-5]
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.
javascript - variable.Property = "test" vs Object.defineProperty(variable,"Property")
如果我想给一个变量a
一个属性P
(非访问器属性),我不在乎它是否可配置/可枚举/可写。
我可以 100% 确定它实际上更有益(以你能想到的所有方式)简单地做一个
而不是使用
所以基本上作为一个规则,我们不应该触及它,Object.defineProperty
除非我们需要创建访问器和/或我们想要控制属性的可配置/可写/可枚举状态?
javascript - 通过带有原型的对象的 ECMAScript 关联数组为空?
我看到很多人这样做
我的问题不是.hasOwnProperty
每次您希望将 anObject
用作哈希时都进行测试,为什么不直接在对象上设置.__proto__
to呢?null
†</p>
我注意到这__proto__
是非标准的。但这仍然没有回答这个问题......
var foo = Object.create(null); Object.getPrototypeOf(foo);
这不可能是一个原始问题,但我找不到任何关于更改__proto__
为null
以消除必须检查继承的缺点?这种方法有什么问题,似乎使代码更快(不必检查 的属性Object
)和更清洁?
†.prototype
如果您打算将其作为未来的孩子,还有该财产。
javascript - 理解 ECMAScript 隐式分号和空格解析
事实上,我经常看到这被引用为为什么在编写 ECMAScript 时使用 K&R 风格。
这在 ECMAScript 或 Javascript 中不起作用:隐式分号添加会导致函数返回undefined
. 但是我也经常看到这个
而且,我想知道为什么隐式分号不会导致返回"BAR"
,为什么会在bar
那里返回?
javascript - 如何停止 Javascript forEach?
我在玩 Node.js 和 Mongoose——试图在递归函数嵌套的深度注释中找到特定的注释forEach
。有没有办法停止 Node.js forEach
?据我了解,每次forEach
迭代都是一个函数,而且我不能只做break
,return
但不会停止forEach
。
javascript - Object.preventExtensions 实际上允许 __proto__ 的突变?
我正在浏览 MDC 关于添加到 Object 的新功能。其中之一,Object.preventExtensions
,据说可以防止对象原型的突变,可以通过使用Object.getPrototypeOf
或获得__proto__
。
然而,在 Chrome 上,它似乎只是允许对对象的原型进行更改。这可以通过执行相关页面上的代码来确认:
我不明白这个TypeError
, and fixed.__proto__.oh === 'hai'
, 所以它已经被设置了,即使它应该被禁止。我也可以在编码时添加它Object.getPrototypeOf(fixed).oh = 'hai'
。
这是否意味着 Chrome 对这个功能有不同的解释?如何防止扩展对象原型(在 Chrome 中)?
javascript - Object.create 与直接原型继承
我一直在玩 EcmaScript 5 规范中的 Object.create,我正在尝试创建一个多重继承类型结构。
假设我有几个函数:a、b 和 c。只处理原型,我可以这样做:
但是使用 Object.create,我会这样做:
我想我两种方式都得到相同的结果。
这似乎有点笨拙,因为我回到对象而不是构造函数。在我看来,进行常规原型继承的侵入性较小,并且对于不需要任何特殊处理即可工作的模块化应用程序更有意义。
我错过了什么吗?尝试通过制作构造函数来制作 Object.create 有什么好处吗?还是这仅对复制现有对象有用?我只想访问附加到原型的属性和函数,而不是之后添加到对象的函数和属性。
或者这个(或者使用更好的深拷贝,但想法保持不变)?
javascript - Object.keys() 在 Internet Explorer 9 中是否适用于内置对象?
Object.keys() 方法适用于我,代码如下:
然而,Object.keys() 为内置对象返回一个长度为零的数组,代码如下:
我错过了什么吗?我正在使用 Internet Explorer 9.0.8112.16421。
后记:我仍然不清楚为什么会这样(例如):
...在 IE9 中不产生任何结果,而这工作正常:
javascript - Object.defineProperty(obj, "prop", desc) 行为异常
如果我定义一个对象并将其可配置属性设置为 false,但不理会所有其他 props,然后尝试将该对象的可写 prop 设置为 false,然后返回 true,则会引发 TypeError。
这是我如何执行此操作的细分,尽管我尝试通过仅更改点符号中的一个对象数据描述符以及更改对象字面量中的对象的所有数据描述符来尝试此操作,但两种形式均无效。
我在规范中找不到任何帮助,但定义属性的 MDC 文章指出,即使在对象属性呈现为不可配置之后,仍可以修改可写数据描述符。所有其他的都不能,但 writable 可以。
那么,这是 Chrome 中的东西,还是我做错了?
/* 更新 */
这已解决 - 只需阅读规范 8.12.9 部分 10.ai
javascript - 为什么新的慢?
基准:
不变量:
测试:
下面按预期速度排序
new f;
g.call(Object.create(Object.prototype));
new (function() { })
(function() { return this; }).call(Object.create(Object.prototype));
实际速度:
new f;
g.call(Object.create(Object.prototype));
(function() { return this; }).call(Object.create(Object.prototype));
new (function() { })
问题:
- 当您交换
f
和g
为内联匿名函数时。为什么new
(测试 4.)测试较慢?
更新:
是什么特别导致new
当f
和g
内联时变慢。
我对 ES5 规范或 JagerMonkey 或 V8 源代码的引用感兴趣。(也可以随意链接 JSC 和 Carakan 源代码。哦,如果 IE 团队愿意,他们可以泄露 Chakra 源代码)。
如果您链接任何JS引擎源,请说明。
javascript - JavaScript 中的原型 OO
TL;博士:
我们是否需要原型 OO 中的工厂/构造函数?我们可以进行范式转换并完全放弃它们吗?
幕后故事:
最近我一直在玩弄用 JavaScript 做原型 OO,发现用 JavaScript 完成的 99% 的 OO 都在强制使用经典的 OO 模式。
我对原型 OO 的看法是它涉及两件事。方法(和静态数据)的静态原型和数据绑定。我们不需要工厂或构造函数。
在 JavaScript 中,这些是包含函数和Object.create
.
这意味着我们可以将所有内容建模为静态蓝图/原型和数据绑定抽象,最好直接连接到文档样式的数据库中。即对象从数据库中取出,并通过使用数据克隆原型来创建。这意味着没有构造函数逻辑,没有工厂,没有new
.
示例代码:
一个伪示例是:
小解释:
特定的代码很冗长,因为 ES5 很冗长。Entity
上面是一个蓝图/原型。任何带有数据的实际对象都将使用Object.create(Entity, {...})
.
实际数据(在本例中为组件)直接从 JSON 存储加载并直接注入到Object.create
调用中。当然,类似的模式也适用于创建组件,只有通过Object.hasOwnProperty
的属性才会存储在数据库中。
第一次创建实体时,它是用空的{}
实际问题:
现在我的实际问题是
- JS原型OO的开源例子?
- 这是一个好主意吗?
- 它是否符合原型 OOP 背后的想法和概念?
- 不使用任何构造函数/工厂函数会在某处咬我吗?我们真的可以不使用构造函数吗?使用上述方法是否有任何限制,我们需要工厂来克服它们。