我目前正在学习高级JavaScript,旨在构建符合标准的(HTML5,CSS3,ESv5)库。在我的方式,我已经问了几个相关的问题,试图找出从哪里开始,做什么,不该做什么,避免什么等等。我已经开始阅读ECMA-262(ECMAScript第5版)文档在开始开发工作之前,我已经运行了一些测试。
以前的问题:
Writing ECMAScript5 compliant code
What's the difference between JavaScript, JScript & ECMAScript?
在我的研究中,我发现不同的浏览器以不同的方式实现标准,并且在这方面,它们实现不同的对象。例如,IE实现了一个名为ActiveXObject的对象,但在FireFox中并非如此。所以我写了一个小测试工具,确定是否在浏览器中定义了什么。
考虑以下测试一些已知对象(包括jQuery,因为它不是内置的)。
同样,我已达到需要帮助的程度:
问题:
鉴于上面的例子,对象和函数之间有什么区别?
我是否在ES / JS中编写函数或对象?
为什么Object是一个函数而不是一个对象?
是否有内置对象/函数的层次结构?
内置的对象/函数可以重新定义为完全不同的东西吗?
内置对象/函数是否未定义?
如果内置的对象/函数尚未支持它们,可以为它们分配新功能吗?
如果某个对象是在一个浏览器中而不是另一个浏览器中定义的,我该如何补偿?
P.S。我不想要与特定实现(JavaScript / JScript)相关的答案,而是与标准(ECMAScript v5)相关的答案。提前谢谢!
答案 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 objects(Node
,HTMLCollection
等类型:他们的行为依赖于实现(“不是ecmascript-native”) - 你不能依赖任何事情。
我是否在ES / JS中编写函数或对象?
咦?您编写代码,可以解释。
为什么Object是一个函数而不是一个对象?
Object
是本机object constructor,因此是一个函数(也是一个Object)。
是否有内置对象/函数的层次结构?
您是否要求“一切都是Object ”?如果你要求DOM接口的结构:它们是依赖于实现的主机对象,但大多数实现者都有一个基于DOM specification的继承系统。
可以将内置对象/函数重新定义为完全不同的东西吗?内置对象/函数是否未定义?
没有。您可以覆盖指向它们的全局变量(全局对象的属性),但是每个实例仍然可以从本机(然后[nearly]不可访问的)构造函数构造。
如果内置对象/函数尚未支持它们,可以为它们分配新功能吗?如果一个对象是在一个浏览器中而不是另一个浏览器中定义的,我该如何补偿呢?
是的,您可以扩展本机对象及其原型。但请注意主机对象,might not like it。如果仅在特定环境中定义对象,则可以轻松测试其存在,并可能shim es5,html5)。
答案 2 :(得分:0)
作为我对ECMAScript / JavaScript的研究的一部分,我发现以下资源提供了有关JS DOM的大量信息。