js笔记(暑假5)

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

猜你喜欢

转载自blog.csdn.net/LFY836126/article/details/81489407