1. 程式人生 > >js之js一切為物件

js之js一切為物件

經常聽見大牛說js最大的優點和資本就是js一切皆為物件;雖然有時候也吹牛逼似得說出來了,但是其實真正並沒有感受到這種魅力所在,今天研究了一下,就隨便寫寫心得。

JavaScript的一切都是物件或者可以看成物件(實質)

帶有屬性和方法的特殊資料型別,而每個屬性或者方法又可看做是一個鍵值對,因此可以這樣定義:物件是一系列無序鍵值對的集合

因此可以這麼理解,只要變數擁有這樣的鍵值對,則可以把它當做是鍵值對。而只要是物件,就繼承於Object物件的prototype屬性;
這麼來看,js中所有這些型別的建立與定義都是源於Object了;
參考的網址中有具體的例子,js最基本的型別中其都有其對應的方法,如var a =”cc”;a就擁有a.length()方法,所以string型別的變數就可以當做是物件。其它基本型別也一樣。

主要還是得理解function是否是一個物件?

主要是先得理解Function和function的區別:

注意:官方定義: 在Javascript中,每一個函式實際上都是一個函式物件.
我們先來看最簡單的兩個程式碼,也是最容易理解的.

function fn(){}
var obj = {}
console.log(fn instanceof Function)//true
console.log(obj instanceof Object)//true
console.log(fn instanceof Object)//true
console.log(obj instanceof
Function)//false

前面兩個列印的效果,大家都容易理解.後面 fn instanceof Object 是為true.
這裡也是一樣,從函式的定義來說: 在javascript中一切函式實際都是函式物件.
所以為true就不奇怪了.obj instanceof Function 為false,當然不奇怪了.因為他是一個物件,不是函式.
我們再來看一個程式碼

console.log(Function instanceof Object); // true
console.log(Object instanceof Function); // true

程式碼很簡單.執行結構兩個都是為true,為什麼呢? 第一個用函式的定義來說,(javascript中函式實際也是一個函式物件),當然為true,那第二個呢?物件也是函式?
Object也是函式.因為Object的結構是function Object(){native code}.
這種形式,很清晰的就是宣告的一個Object函式,當然就是函數了,所以兩個都是為true.
他們兩個Function和Object函式實現程式碼,那當然是不一樣了.他們是怎麼實現的,那我們就不去詳細琢磨了,如果想琢磨的,就可以瞭解瀏覽器的相關知識了.
理解一下:為什麼object要是function Object(){native code}.這種形式呢,個人感覺應該是object是從null由來的,而且需要原型鏈的概念,而原型鏈的最終思想是通過函式來由上往下來傳遞的;它創造自己的建構函式,因為它為這種形式也是方面創造例項;new Object();
上面這種理解是有瑕疵的;這是屬於一種必須的創造方法,有函式往下傳遞子孫,所以函式為什麼存在的原因;
或許可以這麼理解:函式function是上帝,上帝自己本身先建了一系列的屬性,上帝按照自己的屬性先創造了NULL物件(即用new function()方法),然後NULL物件有了創造兒子的能力(即通過原型prototype來傳遞),生了一系列的物件(兒子和孫子);
所以new function()和new Object()都可以使用來創造一個物件的原因就大概如此吧;(兩者之間並不衝突)