Object方法总结

1、Object.assign(target,source,source2……)通过复制一个或多个对象来创建一个新的对象。

将源对象(source)的所有可枚举属性,复制到目标对象(target)。拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)

同名属性将会被后面的源对象属性覆盖

实行的是浅拷贝,而不是深拷贝。

let obj1 = {
    a:1,
    b:2,
}
let obj2 = {
    a:3,
    b:4,
}
let obj3 = {
    e:1,
    f:2,
}
let newObj = Object.assign(obj1,obj2,obj3)
console.log(newObj)// {a: 3, b: 4, e: 1, f: 2}
console.log(obj1)// {a: 3, b: 4, e: 1, f: 2}

let obj4 = {
    a: {b:1}
}
let obj5 = {
    c:2
}
let newObj2 = Object.assign(obj4,obj5)
console.log(newObj2) // {a: {b: 1},c: 2}
obj4.a.b = 3
console.log(newObj2)// {a: {b: 3},c: 2}

let obj6 = {a: 1}
console.log(Object.assign(obj6, null)) // {a: 1}
console.log(Object.assign(obj6, undefined)) // {a: 1}

console.log(Object.assign(null, obj6)) 
console.log(Object.assign(undefined, obj6)) // {a: 1}
// Uncaught TypeError: Cannot convert undefined or null to object

2 Object.create(proto, propertiesObject) 这个方法用于创建一个新对象。被创建的对象继承另一个对象(proto)的原型,在创建新对象时可以指定一些属性( propertiesObject),默认新对象的属性不可枚举,不可更改

如果不是继承一个原有的对象,而是创建一个全新的对象,就要把proto设置为null

let obj = Object.create({a:1}, {b:3})
// Uncaught TypeError: Property description must be an object: 3
let obj = Object.create({a:1}, {b:{value:2}})
console.log(obj) // {b: 2}
console.log(obj.a) // 1
obj.b = 3
console.log(obj.b) // 2
console.log(Object.keys(obj))// []


let obj2 = Object.create(null,{a:{
    value: 2,       // 属性值
    writable: true,     //  是否可以重写值
    enumerable: true,   //是否可枚举
    configurable: true  //是否可以修改以上几项配置
}})

console.log(obj2)//{a: 2}
obj2.a=3
console.log(obj2)// {a: 3}
Object.keys(obj2)// ["a"]

3、Object.defineProperty(object, prop, descriptor) 给对象(object)添加一个属性(prop)并指定该属性的配置(descriptor)

Object.defineProperties(object, {prop1 : descriptor1, prop2 : descriptor2, ...)给对象添加多个属性并指定属性的配置

          1、第一个参数必须为对象

           2、.descriptor 不能同时具有 (value 或 writable 特性)(get 或 set 特性)。

          3、configurable 为false 时,不能重新修改装饰器

var obj = {};
Object.defineProperty(obj, "newDataProperty", {
    value: 101,
    writable: true,
    enumerable: true,
    configurable: true
});
或
Object.defineProperty(obj, "newAccessorProperty", {
    set: function (x) {
        this.otherProperty = x;
    },
    get: function () {
        return this.otherProperty;
    },
    enumerable: true,
    configurable: true
});

var obj2 = {};
Object.defineProperties(obj2, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
});

4、Object.values(obj) 遍历可枚举的属性值,只包含对象本身可枚举属性值,不包含原型链可枚举属性值,返回属性值的数组

5、Object.keys() 遍历可枚举的属性,只包含对象本身可枚举属性,不包含原型链可枚举属性

let arr = ["a", "b", "c"];
let obj = { foo: "bar", baz: 42 };
let ArrayLike = { 0 : "a", 1 : "b", 2 : "c"};

Object.keys(arr)        // ['0', '1', '2']
Object.keys(obj)        // ["foo","baz"]
Object.keys(ArrayLike)  // ['0', '1', '2']

Object.values(arr)        // ["a", "b", "c"]
Object.values(obj)       // ["bar",42]
Object.values(ArrayLike) // ["a", "b", "c"]

 

6、Object.getPrototypeOf(obj) 获取指定对象(obj)的原型(内部[[Prototype]]属性的值)

7、Object.setPrototypeOf(obj,proto) 设置一个指定的对象(obj)的原型(proto)

 

8、Object.entries(obj)返回给定对象自身可枚举属性的 [key, value] 数组。

let obj = {
    a:1,
    b:2,
}
let arr = Object.entries(obj)
console.log(arr)  // [["a", 1],["b", 2]]

9、Object.freeze(obj) 冻结对象:其他代码不能删除或更改任何属性。不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。

10、Object.isFrozen() 判断一个对象是否已经被冻结

11、Object.preventExtensions(obj)让一个对象变的不可扩展,也就是永远不能再添加新的属性

12、Object.isExtensible(obj) 判断一个对象是否可扩展

let o = {a: 1}

o.b = 2      //添加属性b成功
Object.freeze(o)

Object.isFrozen(o)    //true 对象已被冻结

o.a = 2       //修改属性a值失败
o.c = 5       //添加属性c失败
delete o.b   //删除属性b失败

// 当一个对象不可扩展且每一个属性值都设置configurable: false, writable: false,这个对象就已被冻结
let o2 = {a: 1}
o2.b = 2     // 添加属性b成功
Object.priventExtensions(o2)
Object.defineProperties(o2, {
    a: {configurable: false, writable: false},
    b: {configurable: false, writable: false}
})

Object.isFrozen(o2)    //true o4 已经被冻结


// freeze()方法是浅冻结,若要深冻结对象就要给对象中的每一个对象属性使用freeze()方法
let obj = {
    internal :{}
};
Object.freeze(obj);//浅冻结
obj.internal.a = "aValue";
console.log(obj.internal.a);//"aValue"
    
    
function deepFreeze(o){
   var prop,propKey;
    Object.freeze(o);//首先冻结第一层对象
    for(propKey in o){
        prop = o[propKey];
        if(!o.hasOwnProperty(propKey) || !(typeof prop === "object") || Object.isFrozen(prop)){
            continue;
        }
        deepFreeze(prop);//递归
    }
}
    
deepFreeze(obj);
obj.internal.b = "bValue";//静默失败
console.log(obj.internal.b);//undefined

13、Object.seal(obj)将一个对象密封,不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可以修改已有属性的值。

14、Object.isSealed 判断一个对象是否为密封的

var o = {b: 1}
o.d = 2    //添加成功
var obj = Object.seal(o);
obj === o         //true  方法返回原对象,栈指针指向同一块内存
Object.isSealed(o)   // true
o.b = 111       //修改b属性值成功
o.f = 222       //静默失败,属性f没有成功添加
delete o.b      //静默失败,属性b没有成功删除

// 空对象通过Object.preventExtensions方法设置为不可扩展。该对象就是密封的
let o1 = {};
Object.isSealed(o1)    //false
Object.preventExtensions(o1);
Object.isSealed(o1)    // true

// 非空对象通过Object.preventExtensions方法设置为不可扩展,
//并且每一个属性设置configurable: false。该对象就是密封的
let o2 = {a: 1}
Object.preventExtensions(o2);
Object.isSealed(o2)    //false
Object.defineProperty(o2, "a", { configurable: false });
Object.isSealed(o2)    //true

 

15、Object.is() 比较两个值是否相同。所有 NaN 值都相等(这与==和===不同)

Object.is('foo', 'foo')     // true
Object.is({}, {})           // false

// 不同于 === 之处
+0 === -0                   //true
NaN === NaN                 //false

Object.is(+0, -0)           // false
Object.is(NaN, NaN)         // true

16、obj.hasOwnProperty(prop)方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性

let o = {a: 1 }
o.hasOwnProperty('a')   //true
o.hasOwnProperty('b')   //false   对象自身没有属性b
o.hasOwnProperty('toString');  //false  不能检测对象原型链上的属性


// 如何遍历一个对象的所有自身属性,例子:
var buz = {
    fog: 'stack'
};

let ownProp = []
for (var name in buz) {
    if (buz.hasOwnProperty(name)) {
       ownProp[name]
    }
}

 

你可能感兴趣的:(JS,js,javascript)