前兩篇主要是寫了關於JavaScript對象中屬性的特性,在這篇中讓咱們來看看對象的屬性,對象共有3個比較重要的與之相關的屬性,分別是原型、類、可擴展性。函數
原型這個概念已經在第一篇中解釋過了,它是JavaScript對象繼承的核心。對象的原型屬性是用來繼承屬性的,它在對象建立指出就被設置好了,回想下第一篇中介紹的建立對象的3種方法,第一種經過對象直接量建立的對象使用Object.prototype做爲它的原型,其實等價於使用Object()這個構造函數來建立對象;第二種經過new和構造函數建立的對象使用構造函數的prototype屬性做爲它的原型;第三種經過Object.create()方法建立的對象使用方法的第一個參數做爲它的原型。spa
在ECMAScript5中提供了Object.getPrototypeOf()方法來查詢它的原型,以下:prototype
1 var o = {}; 2 Object.getPrototypeOf(o); 3 //返回 Object {} 4 5 var d = new Date(); 6 Object.getPrototypeOf(d); 7 //返回 Invalid Date 8 9 var o = {x:1, y:2}; 10 var i = Object.create(o); 11 Object.getPrototypeOf(i); 12 //返回Object {x: 1, y: 2}
要想檢測一個對象是不是另外一個對象的原型或處於原型鏈中,可使用Object,isPrototypeOf()方法,實現的功能跟instanceof運算符相似,因爲比較簡單,例子仍是不寫了。code
在JavaScript中,對象的類屬性是一個相似於這樣的字符串 [object classname],雖然js沒有自己沒有提供獲取類屬性的方法,可是大衛在這本書中給咱們提供了一個間接方法來查詢:根據toString()方法的返回值,而後提取字符串的第八個至倒數第二個位置之間的字符串。對象
因爲不少對象繼承的toString()方法在繼承過程當中被改變了,因此只能經過call()來調用原始的toString()方法,如下的例子就是經過這個方案來獲取對象的類屬性:blog
1 function classof(o){ 2 if(o === null) return "null"; 3 if(o === undefined) return "undefined"; 4 5 return Object.prototype.toString.call(o).slice(8,-1); 6 }
對象的可擴展性用以表示是否能夠給對象添加新屬性。全部JavaScript內置對象和自定義對象都是可顯式擴展的,宿主對象的可擴展性是由運行環境定義的。須要注意的是,對象是否可擴展不會影響到該對象的原型對象的可擴展性,即一樣會繼承原型對象中新增的屬性。繼承
在ECMAScript5中定義了Object.isExtensible()方法來判斷對象是否能夠擴展,定義了Object.preventExtensions()方法來將一個可擴展的對象轉爲不可擴展,且是單向的,即轉換後沒法再轉回來。ip
可擴展性的目的是將對象「鎖定」,以免外界的干擾,對象的可擴展性一般和該對象中屬性的可寫性和可配置型來配合使用,在ECMAScript5中也定義一組相似的方法來實現這個目的:Object.seal()方法和Object.isSealed()方法,前者除了能將對象設置爲不可擴展的,還能夠將對象的自有屬性都設置爲不可配置的,後者則用來檢查對象是否被封閉(sealed)。一樣的,被封閉的對象沒法「解封」。原型鏈
此外,JavaScript還提供了一組更嚴格的鎖定對象的方法:Object.freeze()和Object.isFrozen(),前者不但把將對象設置爲不可擴展的和將對象的自有屬性都設置爲不可配置,還能夠將全部數據屬性設置爲只讀(但不影響存取器屬性的setter方法);後者則判斷一個對象是否被frozen。字符串
到了這裏,基本上把js基於對象的基礎知識寫完了,提到了不少方法,看看哪天空的時候把這些方法單獨拎出來再寫下。