JavaScript Object学习笔记二
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学习笔记二的更多相关文章
- JavaScript正则表达式学习笔记(二) - 打怪升级
本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...
- JavaScript入门-学习笔记(二)
关于js变量 变量,就是一个用来存储数据的容器 一般来说,我们的变量都是可以得先声明,再使用,就像是一个东西先必须存在,才能看得见摸得着.然而在js里(es5),可以先使用,后声明. a = 100; ...
- JavaScript Object学习笔记一
Object.assign(target, source1, source2, ...)//用于对象的复制合并(同名属性后覆盖前)或拷贝(拷贝自身可枚举属性,不拷贝继承属性或不可枚举属性),将sour ...
- amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- pytest-mark 参数化
在类前或用例前用pytest.mark.parametrize ,可进行参数化 传参方式比较灵活,有很多种,下面是列出的几种方式,其他的可自行研究 @pytest.mark.parametrize(& ...
- 我们可以定向调度某个pod在某个node上进行创建
集群环境:1.k8s用的是二进制方式安装 2.操作系统是linux (centos)3.操作系统版本为 7.2/7.4/7.94.k8s的应用管理.node管理.pod管理等用rancher.k8s令 ...
- 安卓记账本开发学习day1
学习了一些简单的布局与界面设计
- AcWing周赛44
周赛44 4317. 不同正整数的个数 link:https://www.acwing.com/problem/content/4320/ 我直接set #include <iostream&g ...
- partOneJava学习卷土重来-----第一次测试题目介绍
石家庄铁道大学2021年秋季 2020 级课堂测试试卷(一)(15分) 课程名称: JAVA语言程序设计 任课教师: 王建民 考试时间: 150 分钟 一.考试要求: 1.按照测试 ...
- 2021.05.03 T3 数字
2021.05.03 T3 数字 问题描述 一个数字被称为好数字当他满足下列条件: 1. 它有**2*n**个数位,n是正整数(允许有前导0) 2. 构成它的每个数字都在给定的数字集合S中. 3. 它 ...
- 转换为布尔类型 Boolean
1. js 代码 console.log(Boolean('')); // false console.log(Boolean(0)); // false console.log(Boolean(Na ...
- 全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验
移动互联网的发展给人们的社交和娱乐方式带来了很大的改变,以vlog.短视频等为代表的新兴文化样态正受到越来越多人的青睐.同时,随着AI智能.美颜修图等功能在图像视频编辑App中的应用,促使视频编辑效率 ...
- Lab1:练习四——分析bootloader加载ELF格式的OS的过程
练习四:分析bootloader加载ELF格式的OS的过程. 1.题目要求 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootl ...
- C#中的接口和类有什么异同
不同点: 1. 不能直接实例化接口 2. 接口中的成员不能用访问修饰符修饰(默认public) 3. 接口不包含方法的实现 4. 接口可以多继承,类只能单继承. 5. 类定义可在不同的源文件之间进行拆 ...