编写符合ECMAScript5的代码(第2部分)

时间:2012-08-22 19:36:58

标签: javascript jscript ecmascript-5 ecma262

我目前正在学习高级JavaScript,旨在构建符合标准的(HTML5,CSS3,ESv5)库。在我的方式,我已经问了几个相关的问题,试图找出从哪里开始,做什么,不该做什么,避免什么等等。我已经开始阅读ECMA-262(ECMAScript第5版)文档在开始开发工作之前,我已经运行了一些测试。

以前的问题:

Writing ECMAScript5 compliant code

What's the difference between JavaScript, JScript & ECMAScript?

在我的研究中,我发现不同的浏览器以不同的方式实现标准,并且在这方面,它们实现不同的对象。例如,IE实现了一个名为ActiveXObject的对象,但在FireFox中并非如此。所以我写了一个小测试工具,确定是否在浏览器中定义了什么。

考虑以下测试一些已知对象(包括jQuery,因为它不是内置的)。

Browser Feature Test Facility

同样,我已达到需要帮助的程度:

问题:

  1. 鉴于上面的例子,对象和函数之间有什么区别?

  2. 我是否在ES / JS中编写函数或对象?

  3. 为什么Object是一个函数而不是一个对象?

  4. 是否有内置对象/函数的层次结构?

  5. 内置的对象/函数可以重新定义为完全不同的东西吗?

  6. 内置对象/函数是否未定义?

  7. 如果内置的对象/函数尚未支持它们,可以为它们分配新功能吗?

  8. 如果某个对象是在一个浏览器中而不是另一个浏览器中定义的,我该如何补偿?

  9. P.S。我不想要与特定实现(JavaScript / JScript)相关的答案,而是与标准(ECMAScript v5)相关的答案。提前谢谢!

3 个答案:

答案 0 :(得分:2)

  

鉴于上面的例子,对象和函数之间有什么区别?

在Chrome中,所有这些项目都是功能。但是,一般情况下,函数是一个对象,它还包含代码并且可以调用它。所以,你也可以只为函数添加属性(比如jQuery:$("selector")$.ajax)。

  

我是否在ES / JS中编写函数或对象?

嗯,显然这取决于你编码的内容。 function() {}为您提供了一项功能; {}为您提供了一个对象。 (同样,函数最终是对象。)

  

为什么Object是一个函数而不是一个对象?

Object是一个函数,因为您可以将其作为构造函数调用它:

Object();      // returns an empty object
new Object();  // same

此外,鉴于几乎所有内容都是Object的实例,因此Object是一个构造函数,因此是一个函数。 (再次注意,函数也是对象。)

  

是否有内置对象/函数的层次结构?

至于ECMAScript内置对象,从某种意义上说。全局对象上有构造函数(String),实例函数(Array.prototype.forEach)和“静态”函数(Object.defineProperty用于对象,{{1对于数组)。

  

可以将内置对象/函数重新定义为完全不同的东西吗?

当然,你可以Array.isArray。但是依赖于Object = null的任何代码都会开始抛出异常,因此根本不建议这样做。

  

内置对象/函数是否未定义?

不,根据定义,对象不是未定义的。 Object不是对象,反之亦然。这适用于任何对象。

  

如果内置的对象/函数尚未支持它们,可以为它们分配新的功能吗?

是的,例如, undefined不存在,您可以自己设置。但应该注意的是,这些函数在Array.prototype.forEach循环中出现,这又会导致代码行为不同。这可以使用for(var key in arr)使用Object.defineProperty来解决。但还有另一个警告:该功能在整个环境中共享(例如当前页面)。如果其他代码也在设置它们,那么您就会遇到冲突。

  

如果某个对象是在一个浏览器中而不是另一个浏览器中定义的,我该如何补偿?

你可以“填充”这些功能。对于例如诸如{enumerable: false}之类的ES5功能可以使用填充程序,这些填充程序也可以在旧版浏览器上使用。 Underscore.js可能就是一个很好的例子。

答案 1 :(得分:2)

  

鉴于上面的例子,对象和函数之间有什么区别?

function只是object which is callable。但是,我想你要求host objectsNodeHTMLCollection等类型:他们的行为依赖于实现(“不是ecmascript-native”) - 你不能依赖任何事情。

  

我是否在ES / JS中编写函数或对象?

咦?您编写代码,可以解释。

  

为什么Object是一个函数而不是一个对象?

Object是本机object constructor,因此是一个函数(也是一个Object)。

  

是否有内置对象/函数的层次结构?

您是否要求“一切都是Object ”?如果你要求DOM接口的结构:它们是依赖于实现的主机对象,但大多数实现者都有一个基于DOM specification的继承系统。

  

可以将内置对象/函数重新定义为完全不同的东西吗?内置对象/函数是否未定义?

没有。您可以覆盖指向它们的全局变量(全局对象的属性),但是每个实例仍然可以从本机(然后[nearly]不可访问的)构造函数构造。

  

如果内置对象/函数尚未支持它们,可以为它们分配新功能吗?如果一个对象是在一个浏览器中而不是另一个浏览器中定义的,我该如何补偿呢?

是的,您可以扩展本机对象及其原型。但请注意主机对象,might not like it。如果仅在特定环境中定义对象,则可以轻松测试其存在,并可能shim es5html5)。

答案 2 :(得分:0)

作为我对ECMAScript / JavaScript的研究的一部分,我发现以下资源提供了有关JS DOM的大量信息。

http://krook.org/jsdom/index-all.html