一、命名空间(其实就是对象)
管理变量,防止污染全局,适用于模块化开发
多人开发,对象命名容易重复,就要解决命名空间的问题
下面是命名空间的老旧解法
用的时候,用下面的写法
下面是现在公司最常见的方法:用闭包来解决(也可用webpack),返回方法的调用
init是初始化,入口函数,入口名字
init调用了这个函数的功能
var name = "bcd";
var init = (function() {
var name = "acb";
function callName() {
console.log(name);
}
return function() {
callName();
}
}());
init();
var name = "bcd";
var init = (function() {
var name = "acb";
function callName() {
console.log(name);
}
return function() {
callName();
}
}());
init();
var initDeng = (function() {
var name = 123;
function callName() {
console.log(name);
}
return function() {
callName();
}
}())
二、思考问题
如何实现链式调用模式(模仿jquery)
obj.eat().smoke().drink().eat().sleep();
例:
不能像下面这样连续调用
上面改成下面的写法:用return this,就可以连续调用和执行了。deng.smoke().drink().perm().drink().smoke();
var deng = {
smoke: function() {
console.log('smoking,...xuan cool!!!');
return this;
},
drink: function() {
console.log('drinking...,ye cool');
return this;
},
perm: function() {
console.log('preming...,cool');
return this;
}
}
deng.smoke().drink().perm().drink().smoke();
三、属性的表示方法(查看属性)
obj.prop
查看就用.xxxx
obj[“prop”]
中括号也是访问属性的方法
例:想要传序号几,就会调用几
老方法是用switch case
这种方法不好,用下面的方法更好
用方括号来访问属性也是一样的(里面必须是字符串)
这两种基本上完全相同obj.name---->obj[‘name’]
想实现属性名的拼接,只能用方括号的形式
var deng = {
wife1: {
name: "xiaozhang"
},
wife2: {
name: "xiaoliu"
},
wife3: {
name: "xiaowang"
},
wife4: {
name: "xiaomeng"
},
sayWife: function(num) {
return this['wife' + num];
}
}
四、对象的枚举enumeration
1、 for in循环
for in循环(简化版for循环),目的是便利对象,通过对象属性的个数来控制循环圈数,这个对象有多少属性循环多少圈,而且在每一圈时,都把对象的属性名放到prop里面
在枚举里面。一定要写成obj[prop]不能加字符串
枚举也就是遍历:挨个知道信息的过程就叫这个数据组的遍历
<script>
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 0];
//遍历 枚举 enumeration
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
</script>
<script>
var arr = {
name: '123',
age: 1231,
sex: "sfaf",
height: 100,
weight: 84
}
for (var prop in arr) {
console.log(prop + " " + typeof(prop));
}
</script>
上面就是for in循环,就是遍历用的。通过对象的属性个数来控制循环圈数,有多少个属性就会循环多少圈
for(var prop in obj)在循环每一圈的时候,他会把对象的属性名放在prop里面
想遍历谁就in谁,prop可以写别的,obj就是我们想要遍历的对象
var XX in XX 的格式是固定的
var 也可以写在外面,写成var key; for(key in obj1)效果是一样的
<script>
var arr = {
a: 123,
b: 2341,
c: 23124
}
var prop;
for (prop in arr) {
arr.prop++;
}
</script>
写成下面这样会报错
上面的obj.prop系统会以为我们写的是obj[‘prop’],系统会认为我们是在让他访问prop这个属性,不会把prop当成一个变量来使用。写成obj[prop]就可以成功访问了
写对象时用方括号的形式不容易犯错
<script>
var obj = {
name: '123',
age: 123,
sex: 'male',
height: 1230,
weight: 41,
__proto__: {
lastName: 'deng'
}
}
for (var prop in obj) {
console.log(obj[prop]);
}
</script>
2、hasOwnProperty
如果在遍历的时候,我们不想把原型上面的属性拿出来,可以用hasOwnProperty
一般与 for in 循环成套出现
hasOwnProperty 是一个方法,来判断这个对象是你自己的还是原型的, 任何一个对象里面都有 hasOwnProperty,里面是需要传参的,把属性名传进去(如 prop)。下面方法如果不是自己的属性,是原型上的属性,就不会返回。
注明:for in 循环理论上可以返回原型和原型链上的东西,一旦这个原型链延展到了的 object.prototype 上,不会打印系统的,只会打印自带的。
<script>
var obj = {
__proto__: {
lastName: " deng",
__proto__: Object.prototype //不会打印这个 object.prototype
}
}
</script>
加 Object . prototype.abc = ‘123’; 加个!变成只有不是他的才打印
3、in操作符:很少用
in 操作符你的也是你的,你父亲的也是你的,只能判断这个对象能不能访问到这个属性,包括原型上;不是判断属性属不属于这个对象的
判断一个属性属不属于这个对象的只能用 hasOwnProperty
4、instanceof
instanceof 操作用法类似于 in,但是完全不同
A instanceof B 的意思是 A 对象是不是 B 构造函数构造出来的;
记住是:看 A 对象的原型链上有没有 B 的原型
判断这个变量是数组还是变量
区别传的变量是数组还是对象的方法:一是 constructor,二是 instanceof
第三种区分数组还是对象的方法:想让数组调用他的toString 方法
<script>
Object.prototype.toString.call([]); //[]会替换 this
Object.prototype.toString = function() {
//识别 this( 谁调的他, 这个 this 就是谁)
//返回相应的结果
}
obj.toString();
</script>