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

来源:互联网 发布:手机上怎样装修淘宝 编辑:程序博客网 时间:2024/05/22 13:26
       在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"); }

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