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:keyool
age:25
occupation:code man
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]; } } } }
height:no
weight:no
children:[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){
//检查参数是否是undefined
return (typeof obj=="undefined");
}
Object.isNull=function(obj){
//检查参数是否是null
return (typeof obj=="object" && !obj);
}