Function.toString()
返回如下:
"function Function() { [native code] }"
Obeject.toString()
"function Object() { [native code] }"
有时间去看看JavaScript运行时环境(比如rhino) 看看那些native code到底是怎么回事
看的很清楚 这些东东都是function,但他们是内置function,有文章说JavaScript其实是函数式语言Lisp披了C语法的皮
这些内置function 和 你在JavaScript里面写的function有什么不同呢?
这些内置function和你定义的function一样都有prototype属性,而prototype属性在经过new后便copy到目标对象上 这是prototype之所以叫prototype(原型)的原因
所不同的是:
1.这些内置function的prototype的类型是多样的,而你定义的function的prototype就是个Object对象
(当然你可以将你定义的function的prototype赋值为其他什么东西,但会有些诡异的事情发生:
>>> var afn = function(){}; afn.prototype = function(){}; var affn = new afn(); new affn()
affn is not a constructor
undefined
2. 这些内置function的返回值往往和其prototype有某种近似,所以直接调用这些内置function和new这些内置function可能得 到相同的东西或者近似的东西(大概是JavaScript的作者为了更加方便),而你定义的function不会刻意追求返回值和其prototype有 某种近似>>> var afn = function(){}; afn.prototype = function(){}; var affn = new afn(); affn.prototype
Object
) >>> (function yourFunction(){}).prototype
Object
>>> Function
Function()
>>> Function()
anonymous()
>>> Function().toString()
"function anonymous() { }"
>>> Function.prototype.toString()
"function () { }"
>>> Function.prototype.prototypeObject
>>> Date
Date()
>>> Date()
"Thu Mar 13 2008 20:42:14 GMT+0800"
>>> Date.prototype
Invalid Date
>>> var d = new Date(); typeof(d);
"object"
>>> var d = Date(); typeof(d);
"string">>> Number
Number()
>>> Number.prototype 0 //0是对象
>>> Number()
0 //0是简单类型数字0
>>> new Number
0 //0是对象
>>> var n = Number(); typeof(n); "number"
>>> var n = new Number(); typeof(n);
"object"
>>> Array
Array()
>>> Array()
[]
>>> Array.prototype
[]
>>> new Array
[]
>>> new Array()
[]
比较奇特的是Image:
>>> Image
function()
>>> Image.toString()
"[Image]"
>>> Image()Image is not a function
undefined
javascript: with ... (line 1)>>> new Image()
<img>
>>> new Image
<img>
>>> Image.prototype
[xpconnect wrapped native prototype] ELEMENT_NODE=1 ATTRIBUTE_NODE=2 TEXT_NODE=3
-------------------------------------------------------------------------------------------------------------------------------------------------------------
new (Function()) VS new Function() VS Function()
>>> var foo4 = new Function('var temp = 100; this.temp = 200; return temp + this.temp;'); foo4;
anonymous()
>>> var foo4 = Function('var temp = 100; this.temp = 200; return temp + this.temp;'); foo4;
anonymous()
>>> var foo4 = new(Function('var temp = 100; this.temp = 200; return temp + this.temp;')); foo4;
Object temp=200
由前面的说明可知 Function的prototype还是个function (而且是个真正的匿名function) 而Function()的返回值也是个function (是叫做匿名(anonymous)的实名function) ,所以new和直接调用Function() 作用是一样的
------------------------------------------------------------------------------------------------------------------------------------------------------------
对于new我的理解:
对于Class式面向对象语言 new 是开辟内存空间 根据Class定义创建对象
而对于prototype式的面向对象语言JavaScript new的作用主要是copy function中的prototype对象到被创建的对象中,
没有评论:
发表评论