上文(理解javascript原型和作用域系列(1)——一切都是對象)已經(jīng)提到,函數(shù)就是對象的一種,因?yàn)橥ㄟ^instanceof函數(shù)可以判斷。
var fn = function () { };
console.log(fn instanceof Object); // true
對!函數(shù)是一種對象,但是函數(shù)卻不像數(shù)組一樣——你可以說數(shù)組是對象的一種,因?yàn)閿?shù)組就像是對象的一個子集一樣。但是函數(shù)與對象之間,卻不僅僅是一種包含和被包含的關(guān)系,函數(shù)和對象之間的關(guān)系比較復(fù)雜,甚至有一點(diǎn)雞生蛋蛋生雞的邏輯,咱們這一節(jié)就縷一縷。
還是先看一個小例子吧。
function Fn() {
this.name = '王福朋';
this.year = 1988;
}
var fn1 = new Fn();
上面的這個例子很簡單,它能說明:對象可以通過函數(shù)來創(chuàng)建。對!也只能說明這一點(diǎn)。
但是我要說——對象都是通過函數(shù)創(chuàng)建的——有些人可能反駁:不對!因?yàn)椋?/p>
var obj = { a: 10, b: 20 };
var arr = [5, 'x', true];
但是不好意思,這個——真的——是一種——“快捷方式”,在編程語言中,一般叫做“語法糖”。
做“語法糖”做的最好的可謂是微軟大哥,它把他們家C#那小子弄的不男不女從的,本想圖個人見人愛,誰承想還得到處跟人解釋——其實(shí)它是個男孩!
話歸正傳——其實(shí)以上代碼的本質(zhì)是:
//var obj = { a: 10, b: 20 };
//var arr = [5, 'x', true];
var obj = new Object();
obj.a = 10;
obj.b = 20;
var arr = new Array();
arr[0] = 5;
arr[1] = 'x';
arr[2] = true;
而其中的 Object 和 Array 都是函數(shù):
console.log(typeof (Object)); // function
console.log(typeof (Array)); // function
所以,可以很負(fù)責(zé)任的說——對象都是通過函數(shù)來創(chuàng)建的。
現(xiàn)在是不是糊涂了—— 對象是函數(shù)創(chuàng)建的,而函數(shù)卻又是一種對象——天哪!函數(shù)和對象到底是什么關(guān)系?。?/p>
別著急!揭開這個謎底,還得先去了解一下另一位老朋友——prototype原型。
本系列文章不打算動輒幾千字的長篇大論,咱們小步快跑,不至于看的太乏味。
更多建議: