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)}
7)new.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(){
if(new.target==Foo){
Object.assign(this,{})
return:this;
}
}
js中对象的另一种属性名添加方式以及对象的Object.assign方法适用场景
最新推荐文章于 2023-08-25 15:23:02 发布