[英]Why are some JavaScript constructors not functions?
澄清:
应该更恰当地将“JavaScript构造函数”编写为“javascript构造函数”,以强调所考虑的构造函数不仅仅是本机JavaScript语言构造函数,如Object,Array,Function等,还包括其他JavaScript语言定义的外在构造函数。但是浏览器固有的,例如XMLHttpRequest
,“JavaScript”一词意味着表示这些构造函数是使用JavaScript表达和访问的。
一些参考:
constructor
Worker()
构造函数......” 在修辞上,有对构造函数的引用,但不是构造函数对象 !
(好笑,这是因为Objects ARE功能,而Function是对象!
为什么JavaScript中的函数既是构造函数又是对象?
更具体地说,对象,或者是obj-eggs?,ARE,忽略文字实例,函数和函数的实例化是函数的对象实例。 可以说,功能是物体存在的基础,事实证明了这一点
7. 功能
先于
8. 使用对象
在MDN文档JavaScript指南中 。 第8节,我反对!,提供了使用构造函数和函数实例创建对象所需的细节!)
为什么与DOM接口的构造函数不起作用?
javascript:
alert([
"using browser environment: \n"+window.navigator.userAgent,
Option, Image, Audio,
Storage, XMLHttpRequest, Worker, FileReader,
] . join("\n\n"));
告诉我们:
使用浏览器环境:
Mozilla / 5.0(X11; U; Linux i686; en-US; rv:1.9.2.3)Gecko / 20100423 Ubuntu / 10.04(lucid)Firefox / 3.6.3[对象选项]
[对象图片]
[对象音频]
[对象存储]
[object XMLHttpRequest]
[对象工作者]
[object FileReader]
但......
javascript:
alert([
XPCNativeWrapper,
].join("\n\n"));
(产生
function XPCNativeWrapper(){[native code]}
)
和JavaScript语言构造函数是ARE函数。
javascript:
alert([
"using browser environment: \n"+window.navigator.userAgent,
Array, Boolean, Date, Function,
Number, Object, RegExp, String,
Error, Iterator,
].join("\n\n"));
给我们:
使用浏览器环境:
Mozilla / 5.0(X11; U; Linux i686; en-US; rv:1.9.2.3)Gecko / 20100423 Ubuntu / 10.04(lucid)Firefox / 3.6.3function Array(){[native code]}
function Boolean(){[native code]}
function Date(){[native code]}
function Function(){[native code]}
函数Number(){[native code]}
function Object(){[native code]}
函数RegExp(){[native code]}
function String(){[native code]}
函数Error(){[native code]}
function Iterator(){[native code]}
第一:
对象是功能
不,不是:
> a = function() {}
function () {}
> a instanceof Object
true
> b = {}
Object
> b instanceof Function
false
toString
方法(在进行字符串连接时调用的方法)不是获取有关对象信息的可靠方法。 如果我使用typeof
,我会得到以下内容:
using browser environment:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:5.0.1) Gecko/20100101 Firefox/5.0.1
function
function
function
object
function
function
function
所以你看,他们中的大多数除了形成Storage
,实际上是函数(它为什么不为工作Storage
,我不知道)。
还要记住,DOM接口的行为可能与本机JavaScript对象不同。
另一方面,在Chrome中 , toString
方法给出了:
[object Function]
[object Function]
[object Function]
function Storage() { [native code] }
function XMLHttpRequest() { [native code] }
function Worker() { [native code] }
function FileReader() { [native code] }
当您警告这些值时,浏览器引擎正在警告value.toString()
因此我们讨论为什么Function.prototype.toString
以奇怪的方式运行。
ES5.1规范规定:
15.3.4.2 Function.prototype.toString()返回函数的依赖于实现的表示形式。 此表示具有FunctionDeclaration的语法。
请特别注意,表示字符串中的空格,行终止符和分号的使用和放置取决于实现。
toString函数不是通用的; 如果此值不是Function对象,则抛出TypeError异常。 因此,它不能转移到其他种类的对象用作方法。
显然,ES5声明toString
返回一个特定于实现的字符串。
如果您阅读ES Harmony提案页面,则说明:
函数到字符串 - 有问题的Function.prototype.toString(markm,allen)的更大规范
这是一些更多的资源:
Function.prototype.toString
和谐建议 Function.prototype.toString
提议 Function.prototype.toString
邮件存档 基本上,一个已知的问题是toString
on function objects(尤其是也是函数的宿主对象)是未定义的行为。 TC39委员会已经在努力使其标准化。
正如你所看到的那样,主机对象被建议在草编中标准化,所以无论是否进入ES6,它都在空中。 但是,生活在ECMA土地上的功能对象应该在和谐建议页面上定义的ES6中具有标准化的toString
方法。
这个问题实际上可能被解释为:
“JavaScript(ECMAScript)语言约定是否适用于浏览器的其他组件并对其进行限定,例如与DOM连接的编程对象?”
原始问题使用假定为Function类型的对象并用作构造函数。 这些示例显示了编程环境和DOM接口在它们如何表示方面存在的二分法。
如果有这种实际的二分法,是否明确了?
这可能是实际问题。 如果是这样,原始问题应该在此之前引导注意真正的问题。
引用:
ECMAScript语言constructor
详细信息:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.