JavaScript深度学习(四)——对象详解

对象 Object

静态成员

  • keys(某个对象),得到某个对象的所有属性名数组
  • values(某个对象),得到某个对象的所有属性值数组
  • entries(某个对象),得到某个对象的所有属性名和属性值的数组

实例成员

实例成员可以被重写

所有对象,都拥有Object的所有实例成员

  • toString方法:得到某个对象的字符串格式

默认情况下,该方法返回"[object Object]";

  • valueOf方法:得到某个对象的值

默认情况下,返回该对象本身

在JS中,当自动的进行类型转换时,如果要对一个对象进行转换,实际上是先调用对象的valueOf方法,然后调用返回结果的toString方法,将得到的结果进行进一步转换。

对象属性的增删改查

  • 增:如果需要给一个对象增加一个属性,
    就直接对象.xxx=xxx 即可,例如:mrDeng.wife= ‘xioaliu’;

  • 删:如果需要删除对象的一个属性,我们需要用到一个关键字叫 delete,
    delete 后边 跟上对象的属性即可,例如:delete mrDeng.age;
    你再去访问 mrDeng.age 就会得到 undefined
    (注意:变量未经声明就使用肯定报错,但是在对象里不会报错,而且输出 undefined)

  • 改:就是重新赋值,上边讲到了。
  • 查:就是查看、访问,上边也讲到了。

对象的创建方法

  1. var obj={}
  2. var obj=new Object() ->构造函数
    (1)系统自带的构造函数 var obj=new Object() 另外还有Array()、Number()
    (2)自定义(注意:凡是构造函数,命名都用大驼峰命名法)
        funciton Person(){
            this.name='bmw';
        }
        使用: var person=new Person();

3.var obj=Object.create(原型)

这样通过Object.create也能创建出对象,括号里放的就是原型,你现在访问obj1.name 就是 a。
    var obj = {name:"a"}; 
    var obj1 = Object.create(obj);
+ 两种值:Object或null
+ ==结论:绝大多数对象最终都继承自 Object.prototype(并不是所有)==

创建一个对象的过程–构造函数内部原理

隐式的三段式:
1)当调用new时,在函数的最前边隐式的加上 
var this = {
    __proto__:Xxx.prototype
};
2)执行 this.xxx = xxx; 
3)在最后隐式的返回 this (return this) 

包装类

当原始值调用某些属性时,JS内部会给原始值一个包装类,
JS会通过一系列操作让你实现此方法。

var str= 'abc'
console.log(str.length) -->new String('abc').length; delete;   //返回3
//原始值本身没有属性和方法,通过内部生成一个一样的字符串对象,
//把length拿到后返回值,然后new的对象销毁

---------------

var num = 123;
//此处给这个new的对象赋值后会直接销毁
num.abc = 'abc' ->(隐式操作)new Number(num).abc = 'abc'; delete;

//解释:当console.log()时会再创建一个对象:new Number(num).abc
//因为赋值的对象已经删除,这个num没有abc的属性,所以返回undefined
console.log(num.abc) //undefined

对象的枚举(遍历)

for … in … 循环

- 如果对象里面有原型(__proto__:{...}),也会把属性拿出。
var obj = {
    name : 'du',
    num : 1
}
//for...in... 循环
for(var prop in obj){
   //  如果使用 obj.prop,会变成这样obj['prop'],返回undefined
        console.log(obj[prop]);
}

hasOwnProperty:判断是否是自己的属性和方法

        var obj = {
                name: 'du',
                num: 999,
                __proto__: {
                    lastName: 'deng'
                }
            }
        for (var prop in obj) {
        //判断属性方法是否是自己的属性和方法,是的话打印,原型的属性就不打印。
            if (obj.hasOwnProperty(prop))
                console.log(obj[prop]);
        }
        //只打印name和num

in

in 只能判断这个属性到底可不可以被这个对 象访问到,并不能判断这个属性属不属于这个对象。

例:"height" in obj 得到 true
(属性是字符串形式的,必须 加上引号,不加会报错的)
( in 基本不用,但是考试有时候会考到) 

instanceof : 判断是否为构造方法的属性

a instanceof b:看 A 对象的原型链上有没有 B 的原型。

例:
[] instanceof Array ->true
[] instanceof Object ->true
思考:如何判断一个变量是数组还是对象。
  • 方法一:arr.constructor,如果返回 function Array(){}就是数组,返回 function Object(){}就是对象。
  • 方法二:arr instanceof Array,如果返回 true 就是数组,返回 false 就是对象。
  • 方法三(无BUG,推荐):调用 Object.prototype.toString.call(arr),数组返回"[object Array]", 对象返回"[object Object]"

克隆对象

//遍历对象 for(var prop in obj)
//1.判断是不是原始值 typeof()-->object,
若不是object,基本就是原始值(可以是null)
//2.判断是数组还是对象   toString(推荐)、instanceof、constructor
//3.建立相应的数组或对象
//4.递归
//深度克隆对象的方法(被克隆对象,克隆对象)
function deepClone(origin, target) {
        var target = target || {},
            toStr = Object.prototype.toString,
            arrStr = "[object Array]";
            
        for (var prop in origin) {
            if (origin.hasOwnProperty(prop)) {
                if (origin[prop] !== null && typeof(origin[prop]) == 'object') {
                    if (toStr.call(origin[prop]) == arrStr) {
                        target[prop] = [];
                    } else {
                        target[prop] = {};
                    }
                    deepClone(origin[prop], target[prop]);
                } else {
                    target[prop] = origin[prop]
                }
            }
        }
        return target;
    }
//使用
var a = deepClone(obj);
deppClone(obj,a);

//浅克隆:同地址,你改我也改
var obj = {name : "du" }
var obj1 = {}
for(var prop in obj){
    obj1[prop] = obj{prop}
}
发布了6 篇原创文章 · 获赞 0 · 访问量 80

猜你喜欢

转载自blog.csdn.net/djc_18706636375/article/details/105635943
今日推荐