命名空间的作用:管理变量,防止全局污染,适用于模块化开发,闭包的变量私有化就是一个很好的处理命名空间的问题.
小技巧:
1.方法的连续调用,类同jQuery里面的连续调用:
var preson= {
name : function(){
console.log("name")
return this;
},
age: function(){
console.log("age");
return this;
},
sex: function(){
console.log("sex");
return this;
},
}
preson.name().age().sex();
2.属性表示方法obj.prop--> obj['prop']在浏览器内部会有这样子隐式的转换
用在属性拼接,比如on+click on+mousedown
var presons = {
preson1 : {name : 'xiaoxiao'},
preson2 : {name : 'dada'},
preson3 : {name : 'laolao'},
call: function(num){
return this[ ' preson ' + num]; //注意字符串+什么都等于字符串
}
}
preson.call(1);
3.对象的枚举
for in
1.hasOwnProperty该方法用来判断这个属性是不是对象自己的,返回值是布尔值
2.in操作符,不论是原型上的属性还是对象本身具有的属性,只要存在就返回true
3.instanceof
var obj = {
name : 'xiao',
age : 18,
sex : man,
__proto__ : {
lastName: 'sun'
}
}
for ( var key in obj){
console.log(obj.key); //obj.key --> obj['key'] -->undefined
console.log(obj[key]); //打印的就是属性的值
console.log(key); //打印的是属性名,typeof是字符串
1.hasOwnPrototype判断属不属于对象本身,一般用来过滤,得到不是原型上的属性
if(obj.hasOwnPrototype(key)){
console.log(obj[key]);
}
}
2.in 不管是对象本身还是原型链上的,只要有就遍历
"sex" in obj -->true
"lastNme" in obj -->true
3.instanceof的用法
A instanceof B 官方解释用来判断A对象是不是构造函数B构造出来的,但是当打印下列结果,会发现很牵强,这样的说法,所以,真正来说应该是:看A对象的原型链上有没有B的原型
function Preson(){}
var preson = new Preson();
preson instanceof Preson -->true -->显然原型链第一个就是Preson
但是preson instanceof Object -->true --> 原型链末端就是Object
[] instanceof Array -->true
[] instanceof Object -->true
所以如何区分一个变量是数组还是对象的方法有:
var arr = [];
var obj = {};
arr.constuctor-->function Array(){}
obj.constuctor -->function Object(){}
arr instanceof Array -->true
obj instanceof Array -->fales
Object.prototype.toString.call([])-->"[Object Array]"
Object.prototype.toString.call(123)-->"[Object Number]"
Object.prototype.toString = function(){
//识别this,但是当toString的点前面的对象调用该方法时,这个this就指向这个点前面的对象
//返回识别的结果
}
var obj = {}
obj.toString();
所以上面的通过call改变了this的指向.从而判断对象类型.