澄清:
应该更恰当地将“JavaScript构造函数”编写为“javascript构造函数”,以强调所考虑的构造函数不仅仅是本机JavaScript语言构造函数,如Object,Array,Function等,还包括其他JavaScript语言定义的外在构造函数。但是浏览器固有的,例如XMLHttpRequest
,“JavaScript”这个词意味着表示这些构造函数是使用JavaScript表达和访问的。
一些参考文献:
constructor
Worker()
构造函数......”
Worker - MDN Docs 修辞上,有对构造函数函数的引用,但不是构造函数对象!
(好笑,这是因为对象是功能,功能是对象!
Why in JavaScript is a function considered both a constructor and an object?
更具体地说,对象,或者是obj-eggs?,ARE,忽略文字实例,函数和函数的实例化是函数的对象实例。可以说,功能是物体存在的基础,事实证明了这一点
7. Functions
先
8. Working with Objects
在MDN文档JavaScript Guide中。第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 Image]
[object Audio]
[对象存储]
[object XMLHttpRequest]
[对象工人]
[object FileReader]
但......
javascript:
alert([
XPCNativeWrapper,
].join("\n\n"));
(产生
function XPCNativeWrapper(){ [本地代码]}
)
和JavaScript语言constructors是函数。
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(){ [本地代码]}
function Boolean(){ [本地代码]}
function Date(){ [本地代码]}
function Function(){ [本地代码]}
function Number(){ [本地代码]}
function Object(){ [本地代码]}
function RegExp(){ [本地代码]}
function String(){ [本地代码]}
function Error(){ [本地代码]}
function Iterator(){ [本地代码]}
答案 0 :(得分:4)
首先:
对象是函数
不,不是:
> 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
,我不知道。)< / p>
还要记住,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] }
答案 1 :(得分:1)
当您提醒这些值时,浏览器引擎会提醒value.toString()
,因此我们正在讨论为什么Function.prototype.toString
会以一种奇怪的方式行事。
ES5.1规范声明:
15.3.4.2 Function.prototype.toString() 返回函数的依赖于实现的表示。此表示具有FunctionDeclaration的语法。
请特别注意白色空间,线路终结器的使用和放置 表示字符串中的分号是依赖于实现的。
toString函数不是通用的;如果此值不是Function对象,则抛出TypeError异常。因此,它不能转移到其他类型的对象用作方法。
显然,ES5声明toString
返回特定于实现的字符串。
如果您阅读了ES Harmony proposals页面,请说明:
函数到字符串 - 有问题的Function.prototype.toString(markm,allen)的更大规范
以下是更多资源:
Function.prototype.toString
Function.prototype.toString
Function.prototype.toString
基本上,已知的问题是toString
对函数对象(尤其是也是函数的宿主对象)是未定义的行为。 TC39委员会已经在努力使其标准化。
正如你所看到的那样,主机对象被建议在草编中标准化,所以无论是否进入ES6,它都在空中。但是,生活在ECMA土地上的功能对象应该在ES6中具有标准化的toString
方法,如和谐建议页面中所定义的那样。
答案 2 :(得分:1)
这个问题实际上可能会被解释为:
“JavaScript(ECMAScript)语言约定是否适用于浏览器的其他组件并对其进行限定,例如与DOM连接的编程对象?”
原始问题使用假定为Function类型的对象并用作构造函数。这些示例显示了编程环境和DOM接口在它们如何表示方面存在的二分法。
如果存在这种实际的二分法,是否明确了?
这可能是实际问题。如果是这样,原始问题应该在此之前引导注意真正的问题。
的引用:
ECMAScript语言constructor
详细信息: