学习《JavaScript高级程序设计》----day07


一、理解对象(对象的属性)

1.数据属性

  • [[Configurable]]
    表示属性是否可以使用delete删除并重新定义,是否可以修改它的特性,以及是否可以把它修改为访问器属性。所有直接定义在对象上的属性,该特性默认为true。
    const target = {};
    Object.defineProperty(target, "date", {
    	configurable: false, // 不允许配置date
    	value: "2022"
    });
    
    delete target.date; // 删除date属性无效
    console.log(target.date); // 2022
    
    target.date = "2023"; // 修改date属性值无效
    console.log(target.date); // 2022
    
  • [[Enumerable]]
    表示该属性是否可以使用for-in返回。所有直接定义在对象上的属性,该特性默认为true。
    Object.defineProperty(target, "name", {
    	enumerable: false, // 不允许枚举name
    	value:"yyc"
    });
    
    for	(const pro in target){
    	console.log(pro); // 不会打印name
    }
    
  • [[Writable]]
    表示该属性的值是否可以被修改。所有直接定义在对象上的属性,该特性默认为true。
    Object.defineProperty(target, "bar", {
    	writable: false, // 不允许枚举name
    	value:"foo"
    });
    
    target.bar = "baz"; // 修改无效
    console.log(target.bar); // baz
    
  • [[Value]]
    存放实际的属性值。这个特性的默认值为undefined。
    Object.defineProperty(target, "val", {
    	value:"foo"
    });
    console.log(target.val); // foo
    

2、访问器属性(setter,getter)

  • [[Configurable]]
    表示属性是否可以使用delete删除并重新定义,是否可以修改它的特性,以及是否可以把它修改为访问器属性。所有直接定义在对象上的属性,该特性默认为true。

  • [[Enumerable]]
    表示该属性是否可以使用for-in返回。所有直接定义在对象上的属性,该特性默认为true。

  • [[Get]]
    获取函数,在读取属性时调用,默认值为undefined。

    const target = {
    	_date:null
    };
    
    Object.defineProperty(target, "date",{
    	set(val){
      	 	this._date = val;
       	 	console.log("set property")
     	}
    });
    target.date = "2022" ; // set property
    console.log(target._date); // 2022
    
  • [[Set]]
    设置函数,在设置函数时调用,默认值为undefined。

    Object.defineProperty(target, "date",{
    	get(){
      		console.log(`get property value: ${this._date}`)
        	return this._date;
     	}
    });
    target.date; // get property value: 2022
    

3、Object的方法、对象解构赋值

  • Object.defineProperty()
    1.该方法用于修改对象属性,它接收三个参数,依次是目标对象,要定义或修改的对象属性,一个描述对象。
    2.在调用该方法时,如果configurable,writable,enumerable不指定则默认为false。
  • Object.defineProperties()
    该方法与defineProperty类似,但是它可以同时定义多个属性,它接收两个参数,依次为目标对象、要设置的属性描述对象。
    const book = {};
    Object.defineProperties(book,{
    	title:{
       		value:"《JavaScript高级程序设计》",
        	enumerable:true
    	},
    	edition:{
        	value:4.0,
        	enumerable:true
    	},
    	__year__:{
        	value:"2022/6/2",
        	enumerable:false
    	},
    	year:{
        	enumerable:true,
        	configurable:true,
        	get(){
            	console.log("get property year");
            	return this.__year__;
        	},
        	set(val){
            	console.log("set property year");
            	this.__year__ = val;
        	}
    	}
    });
    
  • Object.getOwnPropertyDescriptor()、Object.getOwnPropertyDescriptors()
    上述方法可以获取指定属性(前一个方法)或多个属性(后一个方法)的属性描述符,返回值是一个对象。
    const yearDescriptor = Object.getOwnPropertyDescriptor(book, "year");
    const bookDescriptors = Object.getOwnPropertyDescriptors(book);
    console.log(yearDescriptor);
    console.log(bookDescriptors);
    
  • Object.assign()
    1.该方法可以合并对象,它接收两个及以上参数,依次是目标对象,一个或多个源对象。返回值是目标对象
    2.该方法会将源对象中的可枚举属性自有属性复制到目标对象
    3.该方法实际上是对每个源对象执行的浅复制
    4.如果源对象有相同的属性,则使用最后一个复制对象的属性值
    let	dest = {},
      	src1 = {id:"src", b:'bar',obj:{}},
      	src2 = {id:"src2",a:"foor"},
      	result = null;
    result = Object.assign(dest, src1, src2);
    console.log(result === dest); //true
    console.log(src1 !== dest); //true
    console.log(dest.obj.date); // undefined
    src1.obj.date = "2022";
    console.log(dest.obj.date); // 2022 
    
  • Object.is():
    判定两个值是否相等,返回值为布尔值。
    console.log(Object.is(NaN, NaN));// true
    
    // 0.1+0.2 = 0.30000000000000004
    console.log(Object.is(0.1+0.2, 0.3));// false,
    
  • 对象解构:
    //对象解构
    const obj = {
    	name:"Liming",
    	gender:"男"
    }
    let nameValue, genderValue;
    
    //解构赋值
    ({name:nameValue, gender:genderValue} = obj);
    
    console.log(nameValue, genderValue); // Liming 男
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值