JavaScript中object的一些方法

Object.defineProperty()

一、功能

通过该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并且返回这个对象。

二、语法

2.1 数据描述符

configurable
当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。
enumerable
当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。默认为 false。
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
writable
当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符 (en-US)改变。默认为 false。

	/*
	*obj 要定义属性的对象。
	*prop 要定义或修改的属性的名称或 Symbol 。
	*descriptor 要定义或修改的属性描述符。
	*/
	let new_obj = new Object();

	Object.defineProperty(new_obj , 'text', {
    	configurable: false, 
    	value: 'test', 
    	writable: true,    
    	enumerable: true,
	})

	console.log(new_obj.text)  //test

2.2 存取描述符

get
属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。默认为 undefined。
set
属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。默认为 undefined。

	let obj = new Object();
    Object.defineProperty(obj, 'text', {
        set(value) {
            this.value = value;
            console.log(this.value)
        },
        get() {
            return '<<'+this.value+'>>'
        }
    })
    obj.text = "test";
    console.log(obj.text); //<<test>>

2.3 注意

数据描述符和存取描述符不能同时使用,否则会报错。

Object.assign()

一、功能

该方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。

二、语法

Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。

2.1 合并对象 注:目标对象自身也会改变

	const o1 = { a: 1 };
	const o2 = { b: 2 };
	const o3 = { c: 3 };
	
	const obj = Object.assign(o1, o2, o3);
	console.log(obj); // { a: 1, b: 2, c: 3 }
	console.log(o1);  // { a: 1, b: 2, c: 3 }

2.2 深拷贝问题

针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是(可枚举)属性值。

假如源值是一个对象的引用,它仅仅会复制其引用值。

	const log = console.log;
    function test() {
        let obj1 = { a: 0, b: { c: 0 } };
        let obj2 = Object.assign({}, obj1);
        log(JSON.stringify(obj2));
        // { a: 0, b: { c: 0}}
        
        obj1.a = 1;
        log(JSON.stringify(obj1));
        // { a: 1, b: { c: 0}}
        log(JSON.stringify(obj2));
        // { a: 0, b: { c: 0}}
        
        obj2.a = 2;
        log(JSON.stringify(obj1));
        // { a: 1, b: { c: 0}}
        log(JSON.stringify(obj2));
        // { a: 2, b: { c: 0}}

        obj2.b.c = 3;
        log(JSON.stringify(obj1));
        // { a: 1, b: { c: 3}}
        log(JSON.stringify(obj2));
        // { a: 2, b: { c: 3}}

        // Deep Clone
        obj1 = { a: 0, b: { c: 0 } };
        let obj3 = JSON.parse(JSON.stringify(obj1));
        obj1.a = 4;
        obj1.b.c = 4;
        log(JSON.stringify(obj3));
        // { a: 0, b: { c: 0}}
    }
    test();

2.3 合并相同属性的 属性将被后续参数中具有相同属性的其他对象覆盖。

2.4 继承属性和不可枚举属性是不能拷贝的

	const obj = Object.create({foo: 1}, { // foo 是个继承属性。
	    bar: {
	        value: 2  // bar 是个不可枚举属性。
	    },
	    baz: {
	        value: 3,
	        enumerable: true  // baz 是个自身可枚举属性。
	    }
	});
	
	const copy = Object.assign({}, obj);
	console.log(copy); // { baz: 3 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值