zoukankan      html  css  js  c++  java
  • 由命名空间函数而引发思考--js中的对象赋值问题

    最近没有编码任务,作为一个才毕业的小辣鸡,给的任务就是看一下公司的新系统,熟悉怎么用哪些地方是干什么的。

    下午喝了两杯水,感觉有点浪。然后就开始看了下代码。发现有一个函数是这样子的。

                            var TX = {};
    			//命名空间函数
    			TX.nameSpace = function (str) {
    				var arr = str.split(".");
    				var o = TX;
    				for (i = (arr[0] == "TX") ? 1 : 0; i < arr.length; i++) {
    					o[arr[i]] = o[arr[i]] || {};
    					o = o[arr[i]];
    				}
    			}            
    

    我看到其中for那段的时候。感觉有点看不懂了。果然自己还是太low了。。。。

    假设我穿进去一个"Model"参数。那么这段岂不是 o["Model"]=o["Model"] || {};o=o["Model"];?????????

    当时的我慌了,我觉得我可能不适合干这一行了。我按照我当时的心理分析一下:

    1、首先声明了一个对象TX;

    2、然后var o=TX;这个也好理解,声明了另一个o等于X。我当时这里还想了一下,有可能是地址传递。

    3、然后。。额。。o["Model"]={};o={};.....

    我心想。这能改变TX这个对象并且能达到命名空间的作用吗?我瞬间感觉我刚才那2杯水喝进脑子里了。。这怎么行?!!!我必须查看个究竟!!

    于是我尝试了一下,方式一:

    TX.nameSpace("Model");console.log(TX);

    我发现,真的有了!!!TX下边真的有个object叫做Model!!见鬼了!!

    然后我再次尝试这种方式,方式二:

    TX["Model"]=TX["Model"] || {};TX=TX["Model"];console.log(TX);

    结果你猜怎么着。TX变成了一个空的对象。连nameSpace方法也没了!!!OH!why!!

    我于是再大胆想象了一下。两者如果只是值传递,那么o改变肯定TX是不会改变的。

    如果两者是地址传递。那么为什么上面两种方式得到的结果不一样呢。我以前学的东西在js这里不起作用么。。。还是我以前就错了。。。。

    我于是继续尝试了下方式三:

    var o = TX;
    o["Model"]={};
    o=o["Model"];
    console.log(TX);

    console.log(o);

    细心的我发现,TX确实实现了命名空间想要的结果,o变成了一个空对象。这里边肯定有邪术。我于是有点后悔,我要是早点细心起来,发现万有引力的人应该是我了。哎,继续探究吧。

    我查阅了书,和网上一些相似的例子。终于发现是什么原因了。

    首先TX是一个object,假设TX有一个指针,指向object1。然后有一个o,我们给他赋值了TX,于是o也有一个指针指向了object1。这个时候,我们让o["Model"]={}。说明什么,说明object1.Model={},聪明的你肯定能想到这里。然后o=o["Model"]。这里这个o["Model"]在上一句运行结果里是等于{}的,执行完这一句是什么意思?那就是o重新赋值了,指向了另一个object,假设地址是object2,那么o就指向object2了。这个object2地址里是个空对象,自然方式三输出的就是一个空对象了。但是,但是来了,但是TX还是指向object1地址的,所以,TX下边就有了Model的属性。

    然后问题又来了,其实才接触js不就的小白我不明白这么写有什么意义。要再弄一个对象来修改。为什么不直接使用TX["Model"]={};这样子呢??然后我再次去看了下那个函数。恍然大悟,并不是人家写得不好或者为了让人看不懂。设想一下,假如我传的参数是"TX.Model.Access"呢??

  • 相关阅读:
    递归和this指向
    作用域,闭包
    三种存储方式
    事件流,冒泡,捕获,事件委托
    centos添加登陆成功提示消息
    centos7下安装oracle11g R2报错
    linux下从home分区扩展到根分区
    linux下搭建mongodb副本集
    linux服务下使用nginx之后数据导出超时
    linux下搭建git服务器
  • 原文地址:https://www.cnblogs.com/coder-axin/p/5045485.html
Copyright © 2011-2022 走看看