博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript中对象的常用方法,深克隆和浅克隆以及冻结,扩展,密封三大属性的区别...
阅读量:5891 次
发布时间:2019-06-19

本文共 3159 字,大约阅读时间需要 10 分钟。

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

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({}), '------'); //falseconsole.log(Object.isSealed(seal), '------'); //true
Object.preventExtensions(obj) 方法让一个对象变的不可扩展,也就是永远不能再添加新的
Object.isExtensible(obj) 法判断一个对象是否是可扩展的是否可以在它上面添加新的属性。

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

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

先看一个例子,创建一个对象

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.sexfor (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值,默认undefinevar 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({}, {})); //falseconsole.log(Object.is([], {})); //falseconsole.log(Object.is([], [])); //false
obj.hasOwnProperty(prop) 检查对象有没有该属性
var o = {    prop: 'exists'};console.log(o.hasOwnProperty('prop'));             // 返回 trueconsole.log(o.hasOwnProperty('hasOwnProperty'));   // 返回 false

每天进步一点,希望大家喜欢,也希望喜欢的朋友点个赞,后续继续更新...

转载地址:http://smfsx.baihongyu.com/

你可能感兴趣的文章
java对象的排序_Java对象排序两种方法
查看>>
java jni 原理_使用JNI技术实现Java和C++的交互
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>
Ubuntu 12.04安装
查看>>
mysql client命令行选项
查看>>
vc遍历网页表单并自动填写提交 .
查看>>
配置ORACLE 11g绿色版客户端和PLSQL远程连接环境
查看>>
设计模式:外观模式(Façade Pattern)
查看>>
ASP.NET中 DataList(数据列表)的使用前台绑定
查看>>
Linux学习之CentOS(八)--Linux系统的分区概念
查看>>
主域控制器的安装与配置步骤与方法
查看>>
JavaScript---事件
查看>>
Android NDK入门实例 计算斐波那契数列一生成jni头文件
查看>>
c/c++性能优化--I/O优化(上)
查看>>
将HTML特殊转义为实体字符的两种实现方式
查看>>
jquery 保留两个小数的方法
查看>>
网站架构设计的误区
查看>>
Standard C++ Programming: Virtual Functions and Inlining
查看>>
iis 故障导致网站无法访问
查看>>
作业抄袭简单检测
查看>>