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