深刻理解javascript原型和閉包(1)——一切都是對象

「一切都是對象」這句話的重點在於如何去理解「對象」這個概念。javascript

——固然,也不是全部的都是對象,值類型就不是對象。html

 

首先我們仍是先看看javascript中一個經常使用的運算符——typeof。typeof應該算是我們的老朋友,還有誰沒用過它?前端

typeof函數輸出的一共有幾種類型,在此列出:java

       function show(x) {

            console.log(typeof x);    // undefined
            console.log(typeof 10);   // number
            console.log(typeof 'abc'); // string
            console.log(typeof true);  // boolean

            console.log(typeof function () {});  //function

            console.log(typeof [1, 'a', true]);  //object
            console.log(typeof { a: 10, b: 20 });  //object
            console.log(typeof null);  //object
            console.log(typeof new Number(10));  //object
        }
        show();

以上代碼列出了typeof輸出的集中類型標識,其中上面的四種(undefined, number, string, boolean)屬於簡單的值類型,不是對象。剩下的幾種狀況——函數、數組、對象、null、new Number(10)都是對象。他們都是引用類型web

判斷一個變量是否是對象很是簡單。值類型的類型判斷用typeof,引用類型的類型判斷用instanceof。面試

var fn = function () { };
console.log(fn instanceof Object);  // true

 

好了,上面說了半天對象,各位可能也常常在工做中應對對象,在生活中還得應對活生生的對象。有些個心理不正常或者愛開玩笑的單身人士,還對於系統提示的「找不到對象」耿耿於懷。那麼在javascript中的對象,到底該如何定義呢?json

對象——若干屬性的集合。數組

java或者C#中的對象都是new一個class出來的,並且裏面有字段、屬性、方法,規定的很是嚴格。可是javascript就比較隨意了——數組是對象,函數是對象,對象仍是對象。對象裏面的一切都是屬性,只有屬性,沒有方法。那麼這樣方法如何表示呢?——方法也是一種屬性。由於它的屬性表示爲鍵值對的形式。閉包

並且,更加好玩的事,javascript中的對象能夠任意的擴展屬性,沒有class的約束。這個你們應該都知道,就再也不強調了。app

先說個最多見的例子:

以上代碼中,obj是一個自定義的對象,其中a、b、c就是它的屬性,並且在c的屬性值仍是一個對象,它又有name、year兩個屬性。

 

這個可能比較好理解,那麼函數和數組也能夠這樣定義屬性嗎?——固然不行,可是它能夠用另外一種形式,總之函數/數組之流,只要是對象,它就是屬性的集合。

以函數爲例子:

        var fn = function () {
            alert(100);
        };
        fn.a = 10;
        fn.b = function () {
            alert(123);
        };
        fn.c = {
            name: "王福朋",
            year: 1988
        };

上段代碼中,函數就做爲對象被賦值了a、b、c三個屬性——很明顯,這就是屬性的集合嗎。

你問:這個有用嗎?

回答:能夠看看jQuery源碼!

在jQuery源碼中,「jQuery」或者「$」,這個變量實際上是一個函數,不信你能夠叫我們的老朋友typeof驗證一下。

console.log(typeof $);  // function
console.log($.trim(" ABC "));

驗明正身!的確是個函數。那麼我們經常使用的 $.trim() 也是個函數,常常用,就不用驗了吧!

很明顯,這就是在$或者jQuery函數上加了一個trim屬性,屬性值是函數,做用是截取先後空格。

 

javascript與java/C#相比,首先最須要解釋的就是弱類型,由於弱類型是最基本的用法,並且最經常使用,就不打算作一節來說。

其次要解釋的就是本文的內容——一切(引用類型)都是對象,對象是屬性的集合。最須要了解的就是對象的概念,和java/C#徹底不同。因此,切記切記!

 

最後,有個疑問。在typeof的輸出類型中,function和object都是對象,爲什麼卻要輸出兩種答案呢?都叫作object不行嗎?——固然不行。

具體緣由,且聽下回分解!

 

---------------------------------------------------------------------------

本文已更新到《深刻理解javascript原型和閉包》的目錄,更多內容可參見《深刻理解javascript原型和閉包》。

另外,歡迎關注個人微博

學習做者教程:《前端JS高級面試》《前端JS基礎面試題》《React.js模擬大衆點評webapp》《zepto設計與源碼分析》《json2.js源碼解讀

相關文章
相關標籤/搜索