js中对象的另一种属性名添加方式以及对象的Object.assign方法适用场景

1、新的obj对象数据类型的内容添加方式Object.defineProperty方法
 //参1为要添加的对象 ,参2为添加的属性名  参3为一个object类型用来描述属性名的功能里面可以设置值和该属性的权限
Object.defineProperty(obj,"age",{       
value:18;   //赋值给age    如果后面不写权限功能那么这个键名的权限会全部默认为true
//枚举,添加的键名是否可以遍历  后面跟布尔值  
enumerable:true;
//设置是否可以删除功能
configurable:true//设置是否修改功能
writable:true})
还有一个object.defineProperties(object, descriptors)方法 
作用:除了可以用构造函数和字面量的方式为对象设置属性,也可以使用 object.defineProperties来添加/设置对象属性。
参数object必需。 
功能:对其添加或修改属性的对象。  这可以是本机 JavaScript 对象或 DOM 对象。  
参数descriptors必需。
功能:包含一个或多个描述符对象的 JavaScript 对象,每个描述符对象描述一个数据属性或访问器属(意思就是对象具有数据属性或者访问器属性)
格式:Object.defineProperties(obj,{
name:{  //被添加的一个name属性名
	        value:"zzling", //设置该属性的初始值
		writable:false, //设置可修改性
		enumerable:true, //设置可枚举性
		configurable:true,  //设置可设置性
		},	
setNameWarming:{ //被添加的一个setName属性名
		set:function(newVal){
		alert("警告:有人试图用setNameWarming 访问器属性设置name 的值为"+newVal);
		this.name=newVal
	 	},					  
		get:function(){
		return this.name
     	  	 },
	enumberable:true,
	configurable:true
  }

}2、defineProperty身上还有两个方法    这两个方法不能同时和value、enumerable等功能同时出现
   1)set(){}   //设置
  2)get(){}   //获取
格式:Object.defineProperty(obj,"age",{
   set(value){
this.value=value;
console.log(age被设置的时候触发) // obj.age=18;
}
get(){
console.log(age被获取的时候触发)  // console.log(obj.age);
}
return this.value;
 })
 3、Obejct.assign的适用场景
      1)、合并对象中的键值对     把参数1后面的所有参数合并给参数1  ,即参1有的数据就覆盖没有就新增
2)、给类添加属性
Obejct.assign(this,{
name:name,
age:age,
})
3)、给类添加方法
Obejct.assign(Person.prototype,{
say(){
console.log(this.name)
}
})
4)、克隆对象(深克隆)
let obj2=Obejct.assign({},obj)      //只拿obj对象里面的值不拿地址
5)、克隆类  (可以克隆,父类继承的方法)
克隆类,克隆的是类的原型对象
创建对象的新方法: Object.create();  //创建空对象参数可以放原型 
克隆父类的方法:
Obejct.getPrototypeOf方法是 拿到某个对象里的所有属性
 let temp=Object.getPrototypeOf(obj);  //obj为子类的实例化对象
Object.assign(Object.create(temp),obj)    //obj为子类实例化对象     temp为实例化对象身上的所有属性
6)、合并多个对象()
多个对象的键值对赋值给目标对象
方法格式:(target,....source) =>{Object.assign(target,...source)}
多个对象的键值对赋值给空对象
方法格式:(...source) =>{Object.assign({},...source)}
7new.target 属性  
功能:问实例化对象是从哪里来的
适用场景:父类只能被继承,不可被实例
格式:  父类的constructor(){
this.name=name
if(new.target != 父类){  //当子类实例化的时候判断这个实例化对象是不是来自父类
Object.assign(this,this.name)
}else{
 throw new Errow("该父类只能被继承,不可被实例")//当构造实例了一个父类的时候就抛出报错从				控制台输出
}
}
//先声明一个子类让子类 继承父类
let tv1 =new 子类('z3'//实例子类
tv1.name   // 输出z3
new 父类()//报错 只可被继承不可被实例
8)该类(函数)只能实例化  利用new.target属性来判断
功能:解决new后renturn返回引用值的问题
格式:function Foo(){
ifnew.target==Foo){
 Object.assign(this,{})
return:this;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值