之前說過函數也是對象,也是若干屬性的集合,那為什么用tyoeof操作符打印輸出的卻是function,而不是object呢?
函數與對象之間的關系是怎么樣呢?
誠然,按照我們之前的理解,函數是對象的一種是沒有錯的,數組也是對象的一種,但是它跟數組卻有一點不同,數組我們可以理解成是對象的一個子集,或者是一種變形:
var person = {name:"oyakuki",age:20,say:function(){console.log(this.name + "is saying")}};
var arr = ["a","b","c","d"];
我們可以把數組想想成下面的格式:
var arr = [0:"a",1:"b",2:c,3:"d"];
事實上,在es6中有一個foreach語法,我們通過數組的index,就可以訪問到其value。
但是函數跟對象之間的關系卻是很復雜的,不像數組和對象之間的關系比較簡單;
function Foo(){
this.name = "oyakuki";
this.age = 20;
}
var fn = new Foo();
console.log(typeof fn); //object
上面的代碼中,fn是通過構造函數出來的,并且typeof打印出來的值是object,這說明對象可以通過函數創建出來。
但是我要說的是:對象都是通過函數創建的,可能有人會反駁,因為
var person = {name:"oyakuki",age:20,say:function(){console.log(this.name + "is saying")}};
var arr = ["a","b","c","d"];
但這其實是創建object對象和數組的兩外一種寫法而已,我們稱之為字面量表示法;
另外一種寫法是:
var person = new Object();
person.name = "oyakuki";
person.age = 20;
var arr = new Array();
arr[0] = "a";
arr[1] = "b";
arr[2] = "c";
arr[3] = "d";
而Object 和Array 都是函數,所以說:對象都是通過函數創建的。
那么函數和對象之間的關系到底是什么呢?
理清他們之間的關系,需要了解另外一個概念prototype原型。