javascript中对象的经常使用方法,深克隆和浅克隆以及冻结,扩展,密封三大属性的区别

对象做为引用类型,工做中免不了复制对象,下面来看看克隆的方法

Object.assign() 方法用于将全部可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。浅克隆:
const obj1 = {
    a: 1,
    b: 2,
    title: {
        name: '张三'
    }
};
const obj2 = Object.assign({}, obj1);
console.log(obj2); //{ a: 1, b: 2 ,title:{name:'张三'}}
obj1.title.name = '李四';  //修改obj1的值,再来打印看下obj2的值
console.log(obj2)   //{ a: 1, b: 2,title:{name:'李四'} }
console.log(obj1)  //{ a: 1, b: 2,title:{name:'李四'} }
Object深克隆的一种方式,主要方式是把对象转为JSON字符串,而后再转为对象
var cloneObj = JSON.parse(JSON.stringify(obj));
对象中有冻结,扩展,密封三大属性,freeze,seal,preventExtensions,来看看3个属性的区别
Object.freeze(obj) 方法能够冻结一个对象,不能修改,新增,删除任何属性和值
let freeze1 = {
    a: '1'
};
let freeze2 = Object.freeze(freeze1);
freeze2.a = 2;
console.log(freeze2) //1
Object.isFrozen(obj) 方法判断对象是否被冻结
console.log(Object.isFrozen(freeze2))   //true
Object.seal(obj) 方法封闭一个对象,阻止添加新属性并将全部现有属性标记为不可配置。当前属性的值只要可写就能够改变。
let seal = {};
Object.seal(seal);  //封闭对象
Object.isSealed(obj) 方法判断一个对象是否被密封。
console.log(Object.isSealed({}), '------'); //false
console.log(Object.isSealed(seal), '------'); //true
Object.preventExtensions(obj) 方法让一个对象变的不可扩展,也就是永远不能再添加新的
Object.isExtensible(obj) 法判断一个对象是不是可扩展的是否能够在它上面添加新的属性。

对象可枚举属性和不可枚举属性,一直傻傻分不清,在javascript中,对象的属性氛围可枚举和不可枚举之分,属性的枚举性主要影响一下三个函数的结果,

for ...in 
Object.keys()
JSON.stringify()

先看一个例子,建立一个对象javascript

function Person() {
    this.name = 'KEY'
}

Person.prototype = {
    constructr: Person,
    jos: 'student'
};

var key = new Person();
Object.defineProperty(key, 'sex', {
    value: 'female'
})
console.log(key.sex, '------') //female ------  直接访问能够获取的key.sex
for (var pro in key) {         //遍历没法打印不可枚举对象
    console.log('pro:' + pro + ';' + key[pro])
}
 pro:name;KEY    
 pro:constructr;function Person(){
     this.name='KEY'
 }
 pro:jos;student
obj.propertyIsEnumerable(prop) 方法返回一个布尔值,表示指定的属性是否可枚举
console.log(Number.propertyIsEnumerable('parseint')) //false
Object.defineProperties();方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
Object.defineProperties(obj, props) 
*obj 为源对象
*props是一个对象,里面有configurable,enumerable,value,writable,get,set
*configurable 属性描述符的类型能够被改变而且该属性能够从对应对象中删除。默认false
*enumerable 是否为枚举属性  默认为false
*value 任意值,默认undefined
*writable 能够经过赋值改变  默认false
*get 返回value值,默认undefinde
*set 设置value值,默认undefine

var defind = {};
Object.defineProperties(defind, {
    'v1': {
        value: '12'
    }
});
console.log(defind.v1) //12
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
Object.defineProperty(obj,name, prop)  
*obj 为源对象  name为修改的属性名或设置,prop同上

Object.defineProperty(defind, "key", {
    enumerable: false,
    configurable: false,
    writable: false,
    value: "static"
});
Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组
Object.getOwnPropertyDescriptor(obj, prop) //方法返回指定对象上一个自有属性对应的属性描述符
console.log(Object.getOwnPropertyDescriptor(freeze1, 'a'));
{ value: '1',
 writable: false,
enumerable: true,
 configurable: false }
Object.is(value1, value2)方法判断两个值是不是相同的值。
console.log(Object.is({}, {})); //false
console.log(Object.is([], {})); //false
console.log(Object.is([], [])); //false
obj.hasOwnProperty(prop) 检查对象有没有该属性
var o = {
    prop: 'exists'
};
console.log(o.hasOwnProperty('prop'));             // 返回 true
console.log(o.hasOwnProperty('hasOwnProperty'));   // 返回 false

天天进步一点,但愿你们喜欢,也但愿喜欢的朋友点个赞,后续继续更新...java

相关文章
相关标签/搜索