JavaScript中一切皆對象。es6
除了undefined
以外全部的數據類型都是對象(引用類型)或者有其對應的包裝類(原始類型)。函數
原始值(不可變)this
引用類型spa
//null也是對象 typeof null //"object"
null
除外。能夠理解爲全部對象都是由函數產生的,均可以使用new
關鍵字建立,函數也是一個對象,由Function
產生。prototype
var num = new Number(); //數字 var str = new String(); //字符串 var bool = new Boolean(); //布爾值 var obj = new Object(); //空對象
//定義一個函數 function sum(a, b){ return a + b; } //至關於下面的寫法 var sum = new Function("a", "b", "return a + b");
//自定義構造函數 function Person(name, age){ this.name = name; this.age = age; } var person = new Person('wlicox', 18); //自定義對象
new
一個對象的時候JS作了哪些事情this
對象;this
對象中包括一個prototype
屬性,指向該構造函數的原型;prototype
對象中包括一個construtor
屬性,指向該構造函數自己;this
。用代碼解釋大概就是下面這樣的:code
假設有一個自定義構造函數Person
對象
function Person(name, age){ this.name = name; this.age = age; }
當執行var person = new Person('wlicox', 18)
時blog
function Person(name, age){ //1.隱式的建立一個this對象 var this = { //2.有一個prototype屬性 prototype: { construtor: Foo //3.指回Foo本身 } }; /*用戶代碼*/ this.name = name; this.age = age; return this; //4.隱式的返回this }
new
關鍵字調用,普通函數使用()
調用;new
建立的對象就一直是該返回值(返回原始類型的值不影響結果),普通函數有沒有返回值均可以。function Person(name, age){ this.name = name; this.age = age; return {}; } var person = new Person('wilcox', 18) console.log(person) //{}
prototype
prototype
屬性找到它的原型;construtor
Person === Person.prototype.constructor //true
__proto__
__proto__
屬性找到其構造函數的原型;person.__proto__ === Person.prototype //true
prototype
、construtor
、__proto__
三者的關係
__proto__
屬性,由__proto__
屬性串聯起來的的對象的集合就是原型鏈外;
Object
的原型是最頂端的原型,其中有一個toSting
方法,這也就是爲何全部的數據類型都自帶toString
方法。null
沒有原型
注意:由於對象都是由構造函數參數的因此Function
是一開始就存在的,再js代碼執行的時候,Function
就被放入到內存中,Function
也是對象,但它沒有構造函數,因此它的__proto__
指向它的本身的原型。