64.小技巧
实现方法的连续调用,注意注释部分。
var deng = {
smoke : function (){
console.log('smoking');
return this; //利用this
},
drink : function (){
console.log('drinking');
return this;
},
perm : function (){
console.log('perming');
return this;
}
}
deng.smoke().drink().perm(); //返回结果为smoking drinking perming一共三行,当上面不用return this时 返回结果为undefined,undefined.drink()肯定不对,当返回this时,返回的就是对象,所以最终可以实现方法的连续调用
65.查看属性
1.obj.name / obj['name']
例1:obj.name / obj['name']访问结果都为“abc”,在系统中,你写obj.name查看属性时。在内部还会给你转化为obj['name'],所以要是直接写obj['name']还相对来说是快的
var obj = {
name : 'abc',
}
例2:当你查看deng.sayWife(2)时就可以出现xiaozhang了,要不然只能用switch和case,比较麻烦。
var deng = {
wife1 : {name : "xiaoliu"},
wife2 : {name : "xiaozhang"},
wife3 : {name : "xiaosong"},
wife4 : {name : "xiaozhao"},
sayWife : function (num){
return this['wife' + num]; //这叫属性拼接
}
}
66.对象的枚举(继承模式,命名空间,对象枚举下的36分47秒)enumeration
例1:遍历数组
var arr = [1,2,3,5,6,7,7];
//枚举,遍历:enumeration
for(var i = 0 ; i < arr.length; i++){
console.log(arr[i]);
}
2.for in
例2:for in 循环,目的只有一个,就是遍历对象用的,单独给对象设置一个循环用来遍历的,通过对象的属性的个数来控制循环圈数的,对象有多少的属性就会循环多少圈,每遍历一圈就会把当前圈的的属性名传到prop里面去,
for(var prop in obj)中的prop可以改为其他变量名key什么的都可以,还有var prop也可以放在外面var prop;for(prop in obj){}
var obj = {
name : 'xiaoliu',
age : '21',
sex : 'male',
grade : '3',
prop : 124, //当对象中有prop属性时,访问obj.prop会显示5个124,当系统中没有prop属性时,系统会显示4个undefined
}
for(var prop in obj){
console.log(prop + " " + typeof(prop));
}
for(var prop in obj){
// console.log(obj.prop); //访问obj.prop时系统会在内部转化为obj["prop"],就是将obj对象把prop当成属性来使用,所以解释了上面那句话。
}
例2改正:
var obj = {
name : 'xiaoliu',
age : '21',
sex : 'male',
grade : '3',
/*prop : 124,*/
}
for(var prop in obj){
console.log(obj[prop]); //在其他地方去访问属性可以去用 . ,但是一旦要是在枚举或者for iin循环中写,想调用对象里的属性的话就必须这么写
}
还有以后再调用属性的话,最好写成方括号的形式。
3.obj.hasOwnProperty()方法
例3:obj.hasOwnProperty()方法
只需要打印自己属性或方法,不打印原型链或者原型上上的属性或方法,可以利用下面的方法,利用这个在这里可以说是过滤性的方法obj.hasOwnProperty(prop)这个方法是验证prop是不是自己属性的,结果返回布尔值。
var obj = {
name: 'xiaoliu',
age: '21',
sex: 'male',
grade: '3',
__proto__: {
lastName: 'deng',
}
}
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) //这是个方法,里面需要传参数把把对象的属性名的字符串形式传进去,在这里就是prop,验证prop是不是自己属性的,结果返回布尔值。
{
console.log(obj[prop]); //一般这一段成对出现,
}
}
补充:但是还有一点, console.log(obj[prop]),一旦延伸到了原型链Object.prototype上,不会打印,不会打印系统自带的。,但凡是自己设定的,后添加的,无论在哪都能被弄出来,但凡是系统自带的,都不会被这个方法打印出来。
例3补充:
var obj = {
name: 'xiaoliu',
age: '21',
sex: 'male',
grade: '3',
__proto__: {
lastName: 'deng',
}
}
Object.prototype.abc = 123;
for (var prop in obj) {
if (!obj.hasOwnProperty(prop))
{
console.log(obj[prop]); //打印结果为deng和123。
}
}
例4:in:使用时在控制台直接打印'age' in obj就可以,(不可以age in obj这么写,会报错,因为age是会被看作是变量)然后返回结果为true或者false,即这个属性在或者不在这个对象中。
var obj = {
name: 'xiaoliu',
age: '21',
sex: 'male',
grade: '3',
__proto__: {
lastName: 'deng',
}
}
补充:hasOwnProperty和in的区别,hasOwnProperty是判断这个属性是不是这个对象自己有的,不包括原型,而in是看这个对象能不能调用这属性,包括原型的属性,访问lastName in obj 结果为true。
总结: hasOwnProperty(prop)只能延伸到对象,obj[[prop]可以延伸到原型链,in可以延伸到终极原型即系统自带的。
4.instanceof:它也是个操作符,操作用法类似于in,但是和in完全不同的,
(1)用法: A instanceof B //A 对象是不是 B 构造函数构造出来的
例1:
person instanceof Person
//true
person instanceof Object
//true
[] instanceof Array
//true
[] instanceof Object
//true
(2)总结:看A对象 的原型链上有没有 B的原型
function Person (){
}
var person = new Person();
var obj = {};
person instanceof Person
//true person的原型链顶头就是Person的原型,所以返回true
person instanceof Object
//true 同理
[] instanceof Array
//true 空数组原型链上肯定有Array的原型,所以返回为true
[] instanceof Object
//true 同理
obj instanceof Person
//false 因为空对象与Person没关系,还有不能在控制台上直接写{} instanceof Person因为系统识别不出来是对象还是函数的大括号。
(3)例2:识别未知数据是数组还是对象 var arr = {}; //[]
解决1:obj.constructor
解决2:obj instanceof Array