2008-03-13

JavaScript prototype 彻底研究

在firebug里面信手拈来:


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
>>> var afn = function(){}; afn.prototype = function(){}; var affn = new afn(); affn.prototype
Object
)

2. 这些内置function的返回值往往和其prototype有某种近似,所以直接调用这些内置function和new这些内置function可能得 到相同的东西或者近似的东西(大概是JavaScript的作者为了更加方便),而你定义的function不会刻意追求返回值和其prototype有 某种近似

>>> (function yourFunction(){}).prototype
Object


>>> Function
Function()
>>> Function()
anonymous()
>>> Function().toString()
"function anonymous() { }"
>>> Function.prototype.toString()
"function () { }"
>>> Function.prototype.prototype
Object

>>> 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对象到被创建的对象中,

没有评论:

所见所闻所思