由命名空间函数而引发思考--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"呢??
由命名空间函数而引发思考--js中的对象赋值问题的更多相关文章
- 分享一个好用的函数吧,将js中的对象转成url参数
JavaScript&jQuery获取url参数方法 这个函数呢是自己在写基于Vue+ElementUI管理后台时用到的,,下面列出来两种使用方式: 最普通的,封装一个js函数 /** * 对 ...
- js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- js中推断对象详细类型
大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- Js中Map对象的使用
Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...
- JS中的对象和方法简单剖析
众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...
- js中arguments对象和this对象
js中arguments对象和this属性 如果不注重复习,花时间准备的材料毫无意义 arguments对象和this对象都是对象 直接来代码 <!DOCTYPE html> <ht ...
随机推荐
- Mysql 笔记:
1:可以查看information_schema.index_statistics 来查看索引的使用信息.还可以使用pt-index-usage 这个工具来分析日志再结合explain 来分析使用的索 ...
- IIS7内建账号,应用程序池
在IIS7以前的IIS版本中有一个本地帐号,是在安装时创建的,叫做 IUSR_MachineName.一旦启用匿名身份认证,这个IUSR_MachineName帐号就是IIS默认使用的身份(ident ...
- 阿里云ECS每天一件事D9:nginx1.7整合tomcat8.0
仅通过8080端口访问jsp显然不是一算是一个太好的方法,可以使用nginx的proxy_pass子模块,实现nginx转发jsp请求至tomcat. 典型的配置如下: server { listen ...
- 蓝桥杯之FBI树问题
问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...
- JWPlayer 使用小记
最后的效果 1.从官网下载JWPlayer 下载后的文件,标红部分是必要的文件. 2.Jquery可以使用1.6以上版本 <html><head> <title>G ...
- Jquery读取URL参数
$(document).ready(function(){ function getQueryString(name) { var reg = new RegExp("(^|&)&q ...
- 第八届河南省赛B.最大岛屿(dfs)
B.最大岛屿 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 30 Solved: 18 [Submit][Status][Web Board] De ...
- 沙朗javascript(两)正则表达式
以下提到的文章javascript基础,今天我说些什么javascript正则表达式正确. 说到这首先要问了,什么是正則表達式,正則表達式能干什么? 正則表達式:一个正則表達式就 ...
- UIGI 一级二级三级四级啦啦啦等列表层式排列效果
在每个需要排序的物体上放入GridTag 脚本 其中GridTag脚本用于提供此物体的深度 using UnityEngine; using System.Collections; using Uni ...
- mysql 锁表查询及其处理
1.show OPEN TABLES where In_use > 0; 2.show processlist; 3.kill thread_id; 其中 thread_id为processli ...