命名空间、对象枚举
命名空间
在实际项目开发中,往往一个页面由多人共同开发,这个时候就存在一个问题,一旦命名的变量相同,将会导致冲突,如下
// 张三定义的内容
var num=123;
//李四定义的内容
var num="我是一个字符串"
这个张三在后面调用num时就会发生错误,为了避免该情况的产生,我们一般使用立即执行函数+闭包的功能进行开发,如下
// 张三定义的内容
var initZS = (function() {
var num = 123;
function sayNum() {
console.log(num)
}
return sayNum;
}())
//李四定义的内容
var initLS = (function() {
var num = "我是一个字符串";
function sayNum() {
console.log(num)
}
return sayNum;
}())
initZS();//123
initLS();//我是一个字符串
此时,虽然张三和李四定义的变量名称一样,但是互不影响,各自调用自己声明的变量。
方法的连续调用
小技巧,先了解即可,为对象的每个方法return this,如下
var test = {
sayName: function() {
console.log("my name is liLie");
return this;
},
sayHome: function() {
console.log("my home is NanChong");
return this;
}
}
test.sayName().sayHome()//这个时候即可连续执行多个方法
for in循环
在学习for in循环之前,先普及一个小知识,当我们在调用对象的属性的时候 ,js会将 obj.name 隐式的转换为 obj[‘name’]
var obj = {
name: "xiaowang",
sex: "male",
love: "game"
}
//该语句会将obj的每一个属性名赋值给a
for (var a in obj) {
console.log(obj.a)//标记行
}
通过上述代码,理想的情况是会在控制台打印出obj的每一个属性的值,但是运行代码确是三个undefined,这是怎么回事呢?
之前我们说过,在调用对象属性的时候,js会隐式的将obj.name转换成obj[‘name’],中括号里面是字符串,而此时上述for循环代码等同于
for (var a in obj) {
console.log(obj['a'])//标记行
}
此时系统将a当作了obj的属性名,而在obj中我们没有定义a,故返回undefined,为了让系统将a识别为变量,我们只需要手动更改一个obj[a]即可,如下
for (var a in obj) {
console.log(obj[a])//标记行
}
此时系统就能正确的打印出obj的所有属性值了。
hasOwnProperty() 和 instanceof
####hasOwnProperty()
hasOwnProperty()该方法会判断参数是否是对象的属性,并返回布尔值,语法如下
var obj = {
name: "xiaowang",
sex: "male",
love: "game"
}
//括号中的参数必须为字符串,否则会报错
obj.hasOwnProperty("sex")//true
obj.hasOwnProperty("abcc")//false
instanceof
instanceof用于判断一个a对象是否是通过b构造出来的,语法如下
var a = new Object();
a instanceof Object//true
var b = new Array();
b instanceof Object//true
通过上述代码不难看出,通过object() new的对象可以看出返回值是true,但是为什么 b instanceof Object也返回true呢,这是因为instanceof的原理是在对象的原型上查找是否由object,而array是object的子类,故返回true
本文地址:https://blog.csdn.net/weixin_47582190/article/details/109568447
下一篇: 76.Java中的虚方法调用