js对象枚举

一个this的小知识点

(探究jquery的封装是怎么实现连续调用多个方法的,例如:$(div).css({…})…)

var qs = {
    a : function () {
        console.log("aaa");
        return this;//在每个函数的末尾返回this对象,可以实现对象连续调用多个方法
        //因为this就是谁调用这个函数,函数里面的this就指向谁。
    },
    b : function () {
        console.log("bbb");
        return this;
    },
    c : function () {
        console.log("bbb");
    }
}
qs.a().b().c();//aaa bbb ccc

对象访问属性

两种访问对象属性的方法,
一种就是对象.属性-->obj.name
还有一种就是对象[字符串形式的属性名]---->obj['name']
内部原理每当你访问 obj.name 的时候,--------------->本质上系统隐式的访问的是 obj[‘name’];
如果你直接使用这样的方式obj[‘name’]更方便,因为它内部就是这样执行的,这样访问速度更快。

示例:实现输入索引就输出对应索引属性名属性的值(就是实现属性名字符串的拼接)
var q = {
    a1 :{name : "dong"},
    a2 :{name : "nan"},
    a3 :{name : "xi"},
    a4 :{name : "bei"},
    sayA :function (num){
        return this['a' + num];
        //实现属性名的拼接,只能用对象['属性名' + ...]的方式
    } 
}
console.log(q.sayA(1));//Object { name: "dong" }
console.log(q.sayA(2));//Object { name: "nan" }
console.log(q.sayA(3));//Object { name: "xi" }
console.log(q.sayA(4));//Object { name: "bei" }

对象的枚举 for in

var obj = {
    name : '13',
    age : 89,
    sex : "male",
    height : 180,
    weight : 75
}
for(var prop in obj) {
   console.log(prop + " " + typeof(prop));
   //name string
   //age string
   //sex string
   //height string
   //weight string
      
   console.log(obj.prop); //undefined undefined undefined undefined undefined
 //这个时候系统是把prop当做obj的一个属性,因为它没有这个属性所以会输出undefined
 
   console.log(obj[prop]);
   用obj[prop]就是正确的,这样就会把它当做一个变量来看,不能加上obj['prop'],prop现在本来就是一个字符串
}

对象的 hasOwnProperty 属性和 in 属性

  1. hasOwnProperty(),括号里面传进去的是要判断属性名的字符串形式。
    hasOwnProperty就是过滤性掉原型上的属性,留下只属于自己的属性
var obj = {
    name : '13',
    age : 89,
    sex : "male",
    height : 180,
    weight : 75,
    __proto__ : {//手动给原型上添加一个属性
        lastName  : "deng"
  }
}

Object.prototype.abc = "123";
for (var prop in obj){
   for (var prop in obj){
   if(obj.hasOwnProperty(prop)){//过滤性掉原型上的属性
    console.log(obj[prop]);//13 89 male 180 75
   }   
}
for (var prop in obj){
    //!hasOwnProperty
   if(!obj.hasOwnProperty(prop)){
    console.log(obj[prop]);//deng 123
   }   
}
  1. in 只能判断这个对象能不能访问到这个属性 ,包括原型上的。
    in 的语法格式就是前面就是这个属性的字符串形式,不能直接用属性名,它会识别成变量就不对了。
console.log('height' in obj);//true
console.log('lastName' in obj);//true 
console.log(height in obj);//ReferenceError: height is not defined

instanceof 属性

function Person() {
}
var person = new Person();
// A对象  是不是 B构造函数构造出来的?
//看 A对象的原型链上  有没有 B的原型
// A instanceof B
console.log(person instanceof Person);//true
console.log(person instanceof Object);//true
console.log({} instanceof Object);//true
console.log(person instanceof Array);//false

一个小题目:

var arr = [] || {};//区分是数组还是对象
//1,用constructor方法:[].constructor是function Array(), obj.constructor是 function Object()
//2,用instanceof方法:[] instanceof Array是true, obj instanceof Array是 false
//3,用toString,各个构造函数重写了toString方法

Object.prototype.toString.call([]);
Object.prototype.toString = function () {
    // 识别this
    // 返回相应的结果
}
// obj.toString();

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43623871/article/details/88616656