Javascript面向对象之命名空间问题

       在Javascript中,数组是对象,函数是对象,正则表达式也是对象,当然对象也是对象。对象是属性的容器,它适用于收集和管理数据,对象也可以用于包含其他对象,所以它可以很容易的表示成树型和图型结构。Javascript面向对象中为了防止类名冲突(相同的类名只要属于不同的命名空间,便不会冲突),引入了“命名空间”这一概念。
       对象声明时,还要避开那些关键词和保留字。如:我写了一个对象,声明如下
 var caches = {
	moduleId:'',
	queryParams:{
	    search: '',
	    taskName: ''
	}
    }

在chrome39版本中,通过caches.queryParams.search = "erbin";可以正常赋值;但是在高版本chrome浏览器中,caches.queryParams.search = "erbin", 在控制台抛出“keyword: search is undefined”的异常。起初并没有想到是命名空间的问题。但想到chrome39是可以的,那就考虑到可能高版本中,使用了caches对象。果不其然,我在chrome45版本的控制台输入caches, 才发现原来被CacheStorage占用了(可控的离线缓存,它用来存储response对象的,也就是说用来对HTTP响应做缓存的。在浏览器中的引用名叫caches而不是驼峰写法的CacheStorage)。既然说到了caches, 就在简单说下它吧,由于该技术的规范没有稳定,可能在未来的版本中会有所变化。浏览器兼容情况:


还是接着说对象命名问题,示例如下:

var o = {
    name: "erbin",
    address: {
        addr: "x",
	addr2: 'xx'
    },
    toString: function(){}
};
		
// 如果命名一样会被覆盖
var o = {
    sex: 12
}
function foreach(obj){
    for(var i in obj){
	if(obj.hasOwnProperty(i)){ // 只对key有效
		console.log("have:"+i);
	}
    }
}
foreach(o);
console.log("-----------------------");
foreach(caches.constructor.prototype)
console.log("-----------------------");

// 浏览器自带的对象,不会被覆盖,原因类定义方式不同
var caches = {
    keyword: "12",
    queryParams: {
        moduleId: '',
	searchName: ''
    },
    taskName: '0'
};
foreach(caches);
caches.keyword = "erbin" //上面声明的keyword无效
console.log(caches.keyword)
//caches.queryParames.moduleId = "0006" // 报moduleId is undefined错误
caches.queryParames = {moduleId: '0006'}
console.log("queryParams.moduleId ="+caches.queryParames.moduleId);
console.log("------------------------------");

// 浏览器自带对象,只能添加方法,不能删除方法
caches.constructor.prototype.add = function(){ 
    console.log("add"); 
}

        综合上面的例子, 自定义的对象是可以改变里面的属性和方法的;而浏览器自带的对象可能做了一些特殊处理,不可以删除属性和方法,但可以增加方法。因此,为了避免由于对象定义导致命名空间带来的问题,声明对象时,尽量加上自己业务私有名字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值