1

我目前正在学习高级 JavaScript,目的是构建一个符合标准(HTML5、CSS3、ESv5)的库。一路走来,我已经问了几个相关的问题,试图弄清楚从哪里开始,做什么,不做什么,避免什么等。我已经开始阅读 ECMA-262(ECMAScript 版本 5)文档,并且在我开始开发工作之前已经运行了一些测试。

以前的问题:

编写符合 ECMAScript5 的代码

JavaScript、JScript 和 ECMAScript 有什么区别?

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

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

浏览器功能测试工具

同样,我已经到了需要帮助的地步:

问题:

  1. 给定上面的例子,对象和函数有什么区别?

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

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

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

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

  6. 可以未定义内置对象/函数吗?

  7. 如果内置对象/函数本身不支持它们,是否可以为其分配新特性?

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

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

4

3 回答 3

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用于对象、Array.isArray数组)。

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

当然,你可以做到Object = null。但是任何依赖的代码Object都会开始抛出异常,所以完全不推荐。

可以未定义内置对象/函数吗?

不,对象不是未定义的。undefined不是一个对象,反之亦然。这适用于任何对象。

如果内置对象/函数本身不支持它们,是否可以为其分配新特性?

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

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

您可以“填充”此类功能。例如 ES5 功能,例如Array.prototype.forEach有可用的 shims,这使得它们在旧版浏览器上也可用。Underscore.js 可能是一个很好的例子。

于 2012-08-22T19:53:33.963 回答
2

给定上面的例子,对象和函数有什么区别?

函数只是一个可调用的对象。但是,我猜您询问主机对象的类型(NodeHTMLCollection):它们的行为取决于实现(“不是 ecmascript-native”) - 您不能依赖任何东西。

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

嗯?您编写可以解释的代码。

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

Object是本机对象构造函数,因此是一个函数(也是一个对象)。

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

你问“一切都是对象”吗?如果你问 DOM 接口的结构:它们又是依赖于实现的宿主对象,但大多数实现者都有一个基于DOM 规范的继承系统。

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

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

如果内置对象/函数本身不支持它们,是否可以为其分配新特性?如果一个对象是在一个浏览器中定义的,而不是在另一个浏览器中定义的,我该如何弥补这一点?

是的,您可以扩展本机对象及其原型。但要注意宿主对象,他们可能不喜欢它。如果一个对象仅在某些环境中定义,您可以轻松测试它的存在并可能对其进行填充es5html5)。

于 2012-08-22T20:16:36.947 回答
0

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

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

于 2012-09-03T08:33:04.127 回答