IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 对象密封的四种方式 Object.is Object.assign -> 正文阅读

[JavaScript知识库]对象密封的四种方式 Object.is Object.assign

对象密封的四种方式

preventExtensions

禁止对象的扩展
isExtensible
false 不可扩展
true 可扩展

var obj = { a: 2 };
Object.preventExtensions(obj);

console.log(Object.isExtensible(obj));

在这里插入图片描述

seal

对象的密封
isSealed
true 密封的
false 不密封的

var obj = { a: 2 };
Object.seal(obj);

console.log(Object.isSealed(obj));

freeze

冻住的
isFrozen
true 被冻住的
false 没有被冻住的

var obj = { a: 2 };
Object.freeze(obj);

console.log(Object.isFrozen(obj));

在这里插入图片描述

封装myFreeze

function myFreeze(obj) {
  Object.freeze(obj);
  for (var key in obj) {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      myFreeze(obj[key]);
    }
  }
}

Object.is

对于普通情况下

console.log(NaN === NaN); //false
console.log(+0 === -0); //true

而在使用Object.is

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

除了这两种情况其他的使用下是一样的

console.log({} === {}); //false
console.log(Object.is({}, {})); //false

Object.assign

Object.assign实现对象的浅拷贝
Object.assign(tar,…sources)

let obj = { a: 1 };
let tar = {};
let copy = Object.assign(tar, obj);
console.log(copy);

在这里插入图片描述
我们可以看到下面的情况

let obj = { a: 1 };
let tar = {};
let copy = Object.assign(tar, obj);
console.log(copy);
console.log(copy === obj);
console.log(copy === tar);

在这里插入图片描述
所以tar就是当前的拷贝结果

在这里插入图片描述
后面的属性会覆盖前面的属性

const tar = { a: 1, b: 1 };
const tar2 = { b: 2, c: 2 };
const tar3 = { c: 3 };

Object.assign(tar, tar2, tar3);
console.log(tar);

在这里插入图片描述
对于tar为非对象的情况下 会进行隐式类型转换

const test = Object.assign(1, { a: 2 });
console.log(test);

在这里插入图片描述

const test = Object.assign(false, { a: 2 });
console.log(test);

在这里插入图片描述

const test = Object.assign('abc', { a: 2 });
console.log(test);

在这里插入图片描述

对于非对象进行合并 会进行隐式类型转换 转换后可枚举的才可以合并

const test1 = 'abc';
const obj = Object.assign({}, test1);
console.log(new String(test1));
console.log(obj);

在这里插入图片描述

const test2 = false;
const obj = Object.assign({}, test2);
console.log(new Boolean(test2));
console.log(obj);

在这里插入图片描述

const test3 = 10;
const obj = Object.assign({}, test3);
console.log(new Number(test3));
console.log(obj);

在这里插入图片描述
继承属性 和不可枚举属性 不能拷贝

var obj = Object.create(
  { foo: 1 },
  {
    var: {
      value: 2,
    },
    baz: {
      value: 3,
      enumerable: true,
    },
  }
);
console.log(obj);

var copy = Object.assign({}, obj);
console.log(copy);

在这里插入图片描述
Symbol类型的也可以拷贝

var test = Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' });
console.log(test);

在这里插入图片描述
浅拷贝

const obj1 = { a: { b: 1 } };
const obj2 = Object.assign({}, obj1);
obj1.a.b = 2;
console.log(obj2);

在这里插入图片描述
同名属性的替换 整体替换

const target = { a: { b: 'c', d: 'e' } };

const sources = { a: { b: 'hello' } };
Object.assign(target, sources);
console.log(target);

在这里插入图片描述
数组的替换从索引为0开始替换

var a = Object.assign([1, 2, 3], [4, 5]);
console.log(a);

在这里插入图片描述
没有拷贝整个函数

const source = {
  get foo() {
    return 1;
  },
};
const target = {};

Object.assign(target, source);

console.log(target);

在原型上扩充属性与方法

function Person() {}
var age = 1;
Object.assign(Person.prototype, {
  eat() {},
  age,
});

console.log(Person.prototype);

在这里插入图片描述
可以通过Object.assign定义默认值
如果当我们不传递第三个参数时 第二项是默认值 传入第三项就会抵消第二项的值

const DEFAULT = {
  url: {
    host: 'www.baidu.com',
    port: 7070,
  },
};
function test(option) {
  option = Object.assign({}, DEFAULT, option);
  console.log(option);
}

test({ url: { port: 8080 } });

在这里插入图片描述
Object.assign是无法合并set get 方法的

const source = {
  set foo(value) {
    console.log(value);
  },
};
const str = {};
Object.assign(str, source);
console.log(str);

在这里插入图片描述
我们可以使用defineProperties并且
使用Object.getOwnPropertyDescriptors获取get与set方法
就可以解决set赋值函数不能拷贝的问题

const source = {
  set foo(value) {
    console.log(value);
  },
};
const str = {};
Object.defineProperties(str, Object.getOwnPropertyDescriptors(source));
console.log(str);

在这里插入图片描述
Object.create也可以用来克隆
使用Object.getPropertOf获取对象的原型

var obj = { a: 1, b: 2, c: 3 };
const clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
console.log(clone);

在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:06:34  更:2022-10-22 21:08:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 19:51:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码