对象的属性和方法

对象的属性和方法

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")
原文地址:https://www.cnblogs.com/94-Lucky/p/13493035.html