《深入理解ES6》4.扩展的对象功能
属性初始值的简写
function createPerson(name, age) {return {name,age}; } 复制代码
对象方法的简写
var person = {name: 'angela',sayName() {console.log(this.name)}
}复制代码
可计算属性名
let lastName = 'last name';
var person = {"first name": 'Li',[lastName]: 'yun hua'
}复制代码
方括号中内容同样可以使用表达式作为属性的可计算名称
var suffix = 'name'
var person = {['first ' + suffix]: 'Li',['last ' + suffix]: 'yun hua'
}复制代码
也就是说任何可用于对象实例括号记法的属性名同样可以作为对象字面量中计算属性名
Object.is
对Object.is方法来说,其运算结果大部分情况与===运算符相同,唯一区别在于+0和-0被识别为不相等,NaN和NaN被识别为相等
Object.assign
Object.assign方法接受任意数量的源对象,并按指定的顺序将属性复制到接收对象中,所以如果多个源对象具有同名属性,则排位靠后的源对象会覆盖排位靠前的
有一个需要特别注意的点是Object.assign方法不能将提供者的访问器属性复制到接收对象中,由于Object.assign执行了赋值操作,因此提供者的访问器属性最终会被转变为接收对象中的一个数据属性
var receiver = {},supplier = {get name() {return "file.js"}}
Object.assign(receiver, supplier)
var desc = Object.getOwnPropertyDescriptor(receiver, "name") // {value: "file.js",
writable: true,enumerable: true,configurable: true}
console.log(desc.value)//file.js
console.log(desc.get)//undefined复制代码
重复的对象字面量属性
"use strict";
var person = {name: "Nicholas",name: "Greg" // 在 ES5 严格模式中是语法错误
}; 复制代码
在 ES5 严格模式下运行时,第二个 name 属性会造成语法错误。但 ES6 移除了重复属性的 检查,严格模式与非严格模式都不再检查重复的属性。当存在重复属性时,排在后面的属性 的值会成为该属性的实际值
自有属性的枚举顺序
而 ES6 则严格定 义了对象自有属性在被枚举时返回的顺序。Object.getOwnPropertyNames() 与Reflect.ownKeys (详见第十二章)如何返回属性造成了影响,还同样影响了 Object.assign() 处理属性的顺序
自有属性枚举时基本顺序如下:
复制代码
1. 所有的数字类型键,按升序排列。
2. 所有的字符串类型键,按被添加到对象的顺序排列。
3. 所有的符号类型(详见第六章)键,也按添加顺序排列。
修改对象的原型
Object.getPrototypeOf() 方法来从任意指定对象中获取其原型
Object.setPrototypeOf() 方法允许你修改任意指定对象的原型。它接受两个参数:需要被修改原型的对象,以及将会成为前者原型的对象
使用 super 引用的简单原型访问
若要覆盖对象实例的一个方法、但依然要调用原型上的同名方法
let person = {getGreeting() {return "Hello";}
};
let friend = { getGreeting() {return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!";}
};
// 将原型设置为 person
Object.setPrototypeOf(friend, person);
console.log(friend.getGreeting()); // "Hello, hi!"复制代码
super 是指向当前对象的原型的一个指针,实际上就是 Object.getPrototypeOf(this) 的值
let friend = {getGreeting() { return super.getGreeting() + ", hi!"; }
}; 复制代码
你能使用 super 引用来调用对象原型上的任何方法,只要这个引用是位于简写的方法之内
方法是一个拥有 [[HomeObject]] 内部属性的函数,此内部属性指向该方法所属的对象
任何对 super 的引用都会使用 [[HomeObject]] 属性来判断要做什么。
1:是在 [[HomeObject]] 上调用 Object.getPrototypeOf() 来获取对原型的引用;
2:在该原型上查找同名函数;
3:创建 this 绑定并调用该方法
转载于:https://juejin.im/post/5c6291fa51882562953f8908
《深入理解ES6》4.扩展的对象功能相关推荐
- es6之扩展运算符 Object.assign和 三个点(...)
一.导读 ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里 ...
- 深入理解ES6笔记(九)JS的类(class)
主要知识点:类声明.类表达式.类的重要要点以及类继承 <深入理解ES6>笔记 目录 ES5 中的仿类结构 JS 在 ES5 及更早版本中都不存在类.与类最接近的是:创建一个构造器,然后将方 ...
- 深入理解Java类型信息(Class对象)与反射机制
关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java并发之synchronize ...
- 基于 Wasm 和 ORAS 简化扩展服务网格功能
作者 | 王夕宁 阿里云高级技术专家 来源 | 阿里巴巴云原生公众号 本文将介绍如何使用 ORAS 客户端将具有允许的媒体类型的 Wasm 模块推送到 ACR 注册库(一个 OCI 兼容的注册库)中 ...
- 理解shell命名空间扩展
原文地址: Understanding Shell Namespace Extensions Windows Explorer provides a graphical representation ...
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 C ...
- 为ASP.NET MVC扩展异步Action功能(下)
本文分为上下两部分,您也可以从<Extend ASP.NET MVC for Asynchronous Action>获得全部内容. 执行Action方法 对于执行同步Action的Syn ...
- 用C语言扩展Python的功能的实例
用C语言扩展Python的功能的实例 分类: C/C++ 编程技巧 Programes 2008-04-23 09:31 1232人阅读 评论(0)收藏 举报 python扩展语言cmethodsnu ...
- kotlin 扩展类的功能_Kotlin程序| 扩展功能功能
kotlin 扩展类的功能 扩展功能 (Extension function) Kotlin provides the ability to add more functionality to the ...
最新文章
- 使用OpenCV-Python的函数minMaxLoc()应该注意的两点
- Python3的urllib.parse常用函数小结
- 5 CrawlSpider操作
- Facebook:对比COPA 与CUBIC,BBR v1在拥塞控制及视频质量的表现
- @getmapping注解的作用_@Transactional注解失效了?你遇到的是这6种场景吧!
- [转]十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众
- python判断是不是整数_python判断整数
- i.e.、e.g.、etc.、et al、viz各种缩写都是什么意思?一文搞懂各种缩写
- 计算机房温湿度,数据中心机房标准的温湿度范围
- 大脑的无限存储与记忆传输
- html图片十字形,CSS3 十字架
- java微信公众号图文消息
- Hashtable简述
- Java好学吗?现在待遇如何?
- 计算机博士5篇sci,8篇SCI论文,5篇TOP期刊——一个博士的独白
- 普元BPS启动报错BPS Process Server startup failed,because of the UpGradeManager program
- 区分Linux中的“根目录”和“家目录”
- [商业]博客中国的新广告方式
- 联想平板android版本升级,联想乐Pad A1平板安卓4.0升级操作详细教程
- Jersey 的使用详解