对象的属性和方法
js中,所有的数据类型都是继承自Object(对象),所以都有toString()方法
1.Object.assign()和...arg的区别
- Object.assign() 将一个或者多个对象中可枚举属性复制到第一个参数对象数中,
- 如果后面的对象属性与前面的对象属性相同时,则会覆盖前面的对象属性
- 原对象中增加复制的属性,引用地址不改变
var o1={a:1,b:2,c:3};
var o2={d:4,e:5,f:6};
var o3={a:7,e:8,c:9};
var o0=o={h:10};
Object.assign(o,o1,o2,o3); //可以很多个参数
console.log(o===o0); //true
- ...arg 将一个或者多个对象中可枚举属性复制到第一个参数对象数中,
- 如果后面的对象属性与前面的对象属性相同时,则会覆盖前面的对象属性
- 原对象中属性被复制的属性覆盖,引用地址发生改变
var o5=o4={h:10};
o4={...o1,...o2,...o3}; // 将o1,o2,o3的所有属性解构产生新对象赋值给了o4
console.log(o4===o5); //false 引用地址发生了改变
console.log(o5,o4)
2.Object.defineProperty() 增加对象的一个属性
- 参数: 3个 操作对象,属性名,该属性的描述对象
var obj = {};
Object.defineProperty(obj, "a", {
configurable: true,//true 可以删除 false 不能删除 默认是false
enumerable: true,// true可以枚举(可以遍历到 for in) false 不可枚举 默认是false
writable: true,//true可以写(能修改) false只读(不能修改) 默认是false
value: 10,//该属性的值
});
Object.defineProperty(obj, "b", {
configurable: true,
enumerable: true,
set: function (_v) {}, //这两个属性和writeable value冲突,不能写到一起
get: function () {},
});
Object.defineProperties() 增加对象的多个属性
- 参数: 2个 操作对象 该属性的描述对象(对象中有若干属性)
Object.defineProperties(obj,{
a:{
enumerable:false,
writable:true,
configurable:true,
value:20
},
b:{
writable:true,
configurable:true,
value:function(){
}
},
c:{
configurable:true,
value:100
}
})
console.log(obj);
3.Object.freeze(obj) 冻结数组,函数和对象的属性,但是不会冻结其引用地址
obj.a=10;
obj.b=20;
Object.freeze(obj);
delete obj.a;
obj.a=100;
obj.c=10;
console.log(obj) //冻结后 不能进行属性的删除,修改,增加
obj={a:100,b:0} //引用地址发生改变后,冻结不生效
console.log(obj);
4.Object.getOwnPropertyNames(obj) 获取对象的所有对象属性名,返回值数组
5.Object.getOwnPropertyDescriptor(obj,属性名) 获取对象属性的描述对象
var obj={a:1,b:2,c:3};
console.log(Object.getOwnPropertyNames(obj)); //["a", "b", "c"] 返回对象
console.log( Object.getOwnPropertyDescriptor(obj,"a")); //返回该属性的描述对象 两个参数 一个是操作对象,一个是属性名
上面的这两种方法可以遍历不可枚举属性
6.Object.is(a,b) 判断a,b是否相等,相当于===
- 二者不同之处: Object.is(NaN,NaN) 结果是true ===是false
7.Object.isExtensible(obj) 判断是否是可扩展(不可以增加新属性)
8.Object.isFrozen(obj) 判断是否被冻结
class Ball extends Box{
constructor(){
super();
}
run(){
}
}
9.obj.hasOwnProperty("e") 判断是否有这个属性 动态方法 相当于 in
- 判断是否有某个属性 原型上的属性不算
- in 原型上的属性也算
10.Box.isPrototypeOf(Ball) Ball的父类是否有Box类
console.dir(document.documentElement);
var div=document.createElement("div");
console.log(HTMLElement.isPrototypeOf(div.constructor)); //判断是否是标签
11.obj.propertyIsEnumerable("b") 属性是否可以枚举
12. b instanceof Box b是否是Box的子类(继承属性) 经常用来判断类型
console.log(b instanceof Ball);
console.log(b.constructor===Box);
console.log(typeof b==="object")