javascript中的全域對象,全域對象是一個父級的構造,所有的其他的對象,變數和函數都屬於全域對象。還有一種是Object對象,javascript中的其他對象都是從Object繼承而來,包括內建對象。
一全域對象
1 全域對象的特性
- 全域對象只是一個對象,而不是類。既沒有建構函式,也無法執行個體化一個新的全域對象。
- 全域對象不是任何對象的屬性,所以它沒有名稱。
- 全域對象是預定義的對象,作為 JavaScript 的全域函數和全域屬性的預留位置。
- 在頂層 JavaScript 代碼中,可以用關鍵字 this 引用全域對象。
- 全域對象是範圍鏈的頭,意味著在頂層 JavaScript 中聲明的所有變數都將成為全域對象的屬性。
- 通常不必用 this 引用全域對象,因為所有非限定性的變數和函數名都會作為全域對象的屬性來查詢。
- 通過使用全域對象,可以訪問所有其他預定義的對象、函數和屬性。
- 全域對象的預定義屬性都是可枚舉的,所以可以用 for/in 迴圈列出所有隱式或顯式聲明的全域變數
全域對象是頂層的上下文環境,其他所有對象都屬於全域對象。在web開發中,全域對象為範圍提供了最頂層的上下文環境,並為web開發所依賴的某些高層瀏覽器功能提供了共用的平台。除此之外,全域對象還包括以下內容:
- javascript中所有內建的對象
- javascript中常用的內建屬性
- javascript中某些內建函數
- 某些特定的瀏覽器對象,例如document和window對象
對於範圍,全域對象也提供了非常有用的功能。當引用一個變數時,在當前範圍中並未找到該變數時,解譯器就會沿著範圍鏈向上移動,並沿著範圍鏈尋找該變數,直到查到全域對象。如果始終無法找到該變數,解譯器會認為該變數不存在,並觸發一個異常,當在全域範圍中時,可以使用關鍵字this訪問全域對象。
2 瀏覽器中的全域對象
在瀏覽器中,全域對象有著特殊的用途。除儲存javascript中所有普通功能和作為全域上下文環境外,還容納了大量特定於瀏覽器的對象。例如window和document對象。window對象很有意思,window屬性是一個自引用的成員。既可以通過window.property訪問變數,也可以簡單的使用property來訪問變數。這是因為javascript具有一個全域對象,同時又具有一個本質上與其相同的window對象。
在瀏覽器中,每個視窗,iFrame和選項卡都具有自己唯一的全域對象。在某些情況下,可以通過DOM在這些範圍之間進行通訊,但在通常情況下這些範圍都是相互獨立和隔離的。
執行個體一
擷取全域對象
1 <script type="text/javascript">
2 function getGlobalObject(){
3 return (function(){
4 return this;
5 }).call(null);
6 }
7 var globalobj=getGlobalObject();
8 alert(globalobj);
9 </script>
注意事項:有些全域屬性可以被重寫,例如undefined
二 Object對象
Object對象是javascript語言中其他對象的基類,通過Object,開發人員可以在運行時執行個體化使用者自訂的對象。
屬性列表
- Object.constructor
- Object.prototype
- Obect._parent_
- Object._proto_
方法列表
- Object.eval()
- Object.hasOwnProperty()
- Object.isPrototypeOf()
- Object.propertyIsEnumerable()
- Object.toLocaleString()
- Object.toSource()
- Object.toString()
- Object.unwatch()
- Object.valueOf()
- Object.watch()
- Object._defineGetter_0
- Object._defineSetter_0
- Object._lookupGetter_0
- Object._lookupSetter_0
- Object._noSuchMethod_0
Object對象:
- 當在完全可控的環境中開發javascript時,使用原型繼承擴充javascript基類是一種安全的實踐
- valueOf()方法和toString()方法 區別:valueOf()方法返回一個對象的基本值,而toString()方法則用於返回對象中最用用的文本值。
執行個體二
合并對象
<script type="text/javascript">Object.prototype.merge=function(obj){//確保所處理的是一個有效對象if(typeof this=="object" && obj && typeof obj=="object"){for(var arg in obj){if(typeof obj[arg]=="object" && !obj[arg].length){if(!this[arg]){this[arg]={};}this[arg].merge(obj[arg]);}else{this[arg]=this[arg]||obj[arg];}}}}var person={name:"unkonwn",age:0,height:"no",weight:"no",occupation:"no",children:{count:0,names:[]}}var kycool={name:"keyool",age:25,occupation:"code man"}kycool.merge(person);for(var m in kycool){document.write(m+":"+kycool[m]+"<br/>");} </script>
運行結果:
name:keyoolage:25occupation:code manmerge:function(obj){ //確保所處理的是一個有效對象 if(typeof this=="object" && obj && typeof obj=="object"){
for(var arg in obj){ if(typeof obj[arg]=="object" && !obj[arg].length){ if(!this[arg]){ this[arg]={}; }
this[arg].merge(obj[arg]); }else{ this[arg]=this[arg]||obj[arg]; } } } }height:noweight:nochildren:[object Object]
重寫isType系類函數
//=====================isType系列====================//Object.isArray=function(obj){//檢查參數是否是對象,並且其建構函式是數組建構函式return (typeof obj =="object" && obj.constructor==Array);}Object.isDate=function(obj){//檢查參數是否是對象,並且其建構函式是日期對象的建構函式return (typeof obj =="object" && obj.constructor==Date);}Object.isNumberObject=function(obj){//檢查參數是否是對象,並且其建構函式是Number對象的建構函式return (typeof obj=="object" && obj.constructor==Number);}Object.isStringObject=function(obj){//檢查參數是否是對象,並且其建構函式是String對象的建構函式return (typeof obj=="object" && obj.constructor==String);}Object.isBooleanObject=function(obj){//檢查參數是否是對象,並且其建構函式是Boolean對象的建構函式return (typeof obj=="object" && obj.constructor==Boolean);}Object.isFunction=function(obj){//檢查參數是否是函數對象return (typeof obj=="function");}Object.isObject=function(obj){//檢查參數是否是對象return ((typeof obj=="object" && !!obj)||(typeof obj=="function"));}Object.isRegex=function(obj){//檢查參數是否是RegExp對象return (typeof obj=="object" && obj.constructor==RegExp);}Object.isString=function(obj){//檢查參數是否是字串return (typeof obj=="string");}Object.isNumber=function(obj){//檢查參數是否是數值return (typeof obj=="number" && isFinite(obj));}Object.isBoolean=function(obj){//檢查參數是否是布爾型return (typeof obj=="boolean");}Object.isUndefined=function(obj){//檢查參數是否是undefinedreturn (typeof obj=="undefined");}Object.isNull=function(obj){//檢查參數是否是nullreturn (typeof obj=="object" && !obj);}