Object.create(proto, [propertiesObject])//创建对象,使用参数一来作为新创建对象的__proto__属性,返回值为在指定原型对象上添加自身属性后的对象

//参数proto:必须,新对象的原型对象,可以是null/Object/函数的prototype属性,创建空对象时需传null

//参数[propertiesObject]:可选,添加到自身的可枚举属性,不是添加在原型链上的

Object.create()与new Object()的区别:

new Object()通过构造函数创建对象,添加的属性是在自身实例下的

var obj1 = {name: 'abc'};

var obj2 = new Object(obj1);//{name: 'abc'}  //obj2.__proto__={}

var obj3 = Object.create(obj1);//{}  //obj3.__proto__={name: 'abc'}

obj3.name='abc'//先访问自身属性,找不到再往下找原型上是否存在,不存在则返回undefined

创建空对象时不同

new Object();//{__proto__: Object}//是有原型属性的

Object.create(null);//{}//是没有原型属性的

参数[propertiesObject]添加的自身属性是不可写、不可枚举、不可配置的

var obj4 = Object.create({}, {name: {value: 'abc'}});//{name: 'abc'}

obj4.name = 'def';//obj4.name = 'abc';//不可写

obj4.age = '10'//{name: 'abc', age: '10'}

for(let key in obj4){console.log(key);}//age//不可枚举

delete obj4.name;//false//不可配置

参数[propertiesObject]创建的非空对象的属性描述符默认为false,而构造函数或者字面量方式创建的对象或者Object.create(null)创建的空对象添加的属性的属性描述符默认为true

var obj5 = Object.create({}, {a: {value: 1}});

Object.getOwnPropertyDescriptors(obj5);

// {a: {value: 1, configurable: false, enumerable: false, writable: false}}

var obj6 = Object.create(null); obj6.a = 1;

Object.getOwnPropertyDescriptors(obj6);

// {a: {value: 1, configurable: true, enumerable: true, writable: true}}

var obj7 = new Object({a: 1});

Object.getOwnPropertyDescriptors(obj7);

// {a: {value: 1, configurable: true, enumerable: true, writable: true}}

Object.setPrototypeOf(object, prototype)//设置对象的prototype对象,返回参数对象本身

Object.setPrototypeOf({x: 1}, {x: 2});//{x: 1, __proto__: {x: 2}}

Object.getPrototypeOf(object)//获取对象的原型对象

Object.getPrototypeOf(Object.setPrototypeOf({x: 1}, {x: 2}));//{x: 2}

Object.getPrototypeOf('abc') === String.prototype

Object.getPrototypeOf(true) === Boolean.prototype

Object.getOwnPropertyDescriptor(object, prop)//返回object对象prop属性的描述对象

Object.getOwnPropertyDescriptor({a: 1}, 'a')

//{value: 1, configurable: true, enumerable: true, writable: true}

Object.getOwnPropertyDescriptors(object)//返回object对象自身所有可枚举属性及描述对象

var obj8 = Object.create({x: 1}, {y: {value: 2}});

Object.getOwnPropertyDescriptors(obj8);

//{y: {value: 2, configurable: false, enumerable: false, writable: false}}

Object.assign()[详细请见这篇文章]不能拷贝原型上的属性或方法以及不能正确拷贝属性的get/set方法

可以结合使用Object.create()、Object.setPrototypeOf()、Object.getPrototypeOf()、Object.getOwnPropertyDescriptors()来实现原型上的属性方法的拷贝,替代只有浏览器环境部署的__proto__实现的原型链继承

var obj1 = {a: 1};

function fn(){this.color = 'red';}
Object.assign(fn.prototype, obj1);

var obj2 = new fn();//{color: 'red', __proto__: {a: 1}}

var obj3 = Object.assign({}, obj2);//obj3.color='red'; obj3.a=undefined

var obj4 = Object.assign(Object.create(Object.getPrototypeOf(obj2)), obj2);

//obj4.color='red'; obj4.a=1;//这种方法不能拷贝get/set方法

var obj5 = Object.create(Object.getPrototypeOf(obj2), Object.getOwnPropertyDescriptors(obj2));

//obj5.color='red'; obj5.a=1;//可以拷贝到属性的get/set方法

Object.is()//判断两个值是否严格相等

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

弥补ES5对于+0与-0的判断以及NaN与NaN的判断

+0 === -0//true    NaN === NaN//fakse

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

JavaScript Object学习笔记二的更多相关文章

  1. JavaScript正则表达式学习笔记(二) - 打怪升级

    本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...

  2. JavaScript入门-学习笔记(二)

    关于js变量 变量,就是一个用来存储数据的容器 一般来说,我们的变量都是可以得先声明,再使用,就像是一个东西先必须存在,才能看得见摸得着.然而在js里(es5),可以先使用,后声明. a = 100; ...

  3. JavaScript Object学习笔记一

    Object.assign(target, source1, source2, ...)//用于对象的复制合并(同名属性后覆盖前)或拷贝(拷贝自身可枚举属性,不拷贝继承属性或不可枚举属性),将sour ...

  4. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  5. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  6. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  9. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. 浅谈ES6中的Async函数

    转载地址:https://www.cnblogs.com/sghy/p/7987640.html 定义:Async函数是一个异步操作函数,本质上,Async函数是Generator函数的语法糖.asy ...

  2. 讲解CPU之NUMA硬件体系以及机制(lscpu查看相关信息)

    先看看从系统层面反映出来的numa cpu信息.采样机器为实体机.80核.128内存. [root@ht2 src]# lscpu Architecture: x86_64 #x86架构下的64位 C ...

  3. C++ functional库中的仿函数

    一.仿函数简介 仿函数(functor)又称之为函数对象(function object),实际上就是 重载了()操作符 的 struct或class. 由于重载了()操作符,所以使用他的时候就像在调 ...

  4. NodeJs学习日报——day3

    // 导入模块 const http = require('http') // 创建web服务器实例 const server = http.createServer() // 为服务器实例绑定req ...

  5. YARN线上动态资源调优

    背景 线上Hadoop集群资源严重不足,可能存在添加磁盘,添加CPU,添加节点的操作,那么在添加这些硬件资源之后,我们的集群是不能立马就利用上这些资源的,需要修改集群Yarn资源配置,然后使其生效. ...

  6. Linux获取本机公网IP,调整双节点主从服务的RPC调用逻辑

    简单记录一次双节点的之间的服务调用叭 ~ 现有: 服务A的双节点A1.A2 服务B的双节点B1.B2 服务A 和服务B 通过 Netty 实现 RPC 通信,可能会导致比较玄学的问题.如图: 要做到 ...

  7. Enum枚举类型实战总结,保证有用!

    一般在我们开发时如果能使用枚举罗列的,一般都会定义一个枚举类型.将枚举类型作为方法的参数,可以方便的进行调用,给我们带来不少的遍历,当然有时候它还不如直接用一个int类型带来,带来一定灵活性.但只要能 ...

  8. 论文解读(Debiased)《Debiased Contrastive Learning》

    论文信息 论文标题:Debiased Contrastive Learning论文作者:Ching-Yao Chuang, Joshua Robinson, Lin Yen-Chen, Antonio ...

  9. Golang(go语言)开发环境配置

    VSCode开发环境配置 目录 VSCode开发环境配置 先到VSCode官网去下载适合自己系统的VSCode安装软件 演示在WIndows下 安装使用 演示在Linux(Ubuntu/centos) ...

  10. muduo源码分析之muduo简单运用

    今天不先实现muduo项目,我们先来看下muduo库的基本使用,只有了解了如何用,才能在写代码的时候知道自己写的找个函数是干嘛的,实际上是怎么使用的这个函数.首先说简单点,就是定义一个Server,设 ...