1、Object.is方法返回布尔值,和全等于===差不多,除了参数是+0和-0,以及NaN时

            //Object.is,返回布尔值,和全等于===差不多,除了+0和-0,以及NaN
console.log(Object.is(+0,-0)); //false
console.log(+0 === -0); //true
console.log(Object.is(NaN,NaN)); //true
console.log(NaN === NaN); //false console.log(Object.is(true,false)); //false
console.log(Object.is(true,true)); //true

2、Object.assign方法返回一个对象,在复制或者合并一个对象时很常用到。

该方法用起来和扩展运算符很相似,属性名相同时,后面的会覆盖前面的。并且也是浅拷贝。

assgin(a,b)是将b对象中所有可枚举属性的值复制到目标对象a, 如果存在相同的属性,就将b对象中属性对应的值替换a对象的属性值。
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
语法:Object.assign(target, ...sources)
参数:
target:目标对象。
sources:源对象。
返回值:目标对象。

            //Object.assign,在复制或者合并一个对象时很常用到
const obj = Object.assign({a:1},{b:2},{c:3},{d:4,e:5})
console.log(obj); //{a:1,b:2,c:3,d:4,e:5}
//用起来跟扩展运算符很相似,属性名相同时,后面的会覆盖前面的。并且也是浅拷贝
const obj11 = {
a:1,
b:{
c:2
}
};
let newObj1 = Object.assign({a:3},obj11); //{a:1,b:2,c:3,d:4,e:5}
console.log(newObj1.b.c); //2
newObj1.b.c = 100;
console.log(obj11.b.c); //100

3、Object.keys返回自身可枚举属性的所有key所组成的数组

Object.values返回自身可枚举属性的所有value所组成的数组

Object.entries返回每一对可枚举的key value所组成数组的数组

            //Object.keys Object.values Object.entries

            const obj22 = {
a:1,
b:2,
c:3,
d:4
}
//Object.keys返回自身可枚举属性的所有key所组成的数组
console.log(Object.keys(obj22)); //["a","b","c","d"] //Object.values返回自身可枚举属性的所有value所组成的数组
console.log(Object.values(obj22)); //[1,2,3,4] //Object.entries返回每一对可枚举的key value所组成数组的数组
console.log(Object.entries(obj22)); //[Array(2),Array(2),Array(2),Array(2)]

三个方法返回的都是自身可枚举的属性,也就是说使用for-of进行遍历的时候不需要像for-in一样使用hasOwnProperty()去判断是不是自身的,而不是原型上的属性

      //代码接上

            //三个方法返回的都是自身可枚举的属性,也就是说使用for-of进行遍历的时候不需要像for-in一样使用hasOwnProperty()去判断是不是自身的,而不是原型上的属性
for (let key of Object.keys(obj22)){
console.log(key); //打印结果是四行,分别是a b c d
} for(let [k,v] of Object.entries(obj22)){
console.log(k,v); //打印结果是四行,分别是a 1,b 2,c 3,d 4
}

4、__proto__属性这个属性代表当前对象的原型

            //__proto__这个属性代表当前对象的原型
//该属性位于在es6标准的附录中,在实际编码的时候尽量不要用到,调试编码的时候看看就好
const obj = {
a:1
}
console.log(obj.__proto__); //Object
5、Object.setPrototypeOf(要修改原型的对象,新原型 )方法可以用来修改一个对象的原型。
但是性能有些低下,建议不要使用。setPrototypeOf()方法性能低的原因是:设置原型可能会降低有权访问其原型已发生改变的所有 JavaScript 代码的性能。建议使用OBject.create()。
setPrototypeOf() 

作用:Object.setPrototypeOf() 方法是设置一个指定的对象的原型到另一个对象

用法:Object.setPrototypeOf(obj, prototype)
第一个参数是要设置其原型的对象;第二个参数是要作为新的原型的对象
            //Object.setPrototypeOf(要修改原型的对象,新原型 )方法可以用来修改一个对象的原型
const obj1 = {
a:1
};
const obj2 = {
b:1
}
const obj = Object.create(obj1); //create方法是创建一个对象的时候指定它的原型
console.log(obj.__proto__); //{a:1}
Object.setPrototypeOf(obj,obj2); //这个方法性能有点低下,建议不要使用
console.log(obj.__proto__); //{b:1}
6、Object.getPrototypeOf(对象名)方法读取对象的原型(跟__proto__相比起来,更推荐使用getPrototypeOf)

            //Object.getPrototypeOf方法读取对象的原型
const obj1 = {a:1};
const obj = Object.create(obj1); console.log(obj.__proto__); //{a:1}
console.log(Object.getPrototypeOf(obj)); //{a:1}
console.log(obj.__proto__ === Object.getPrototypeOf(obj)); //true

PS:推荐使用Object.create和getPrototypeO方法去操作对象的原型


7、super关键字,它可以访问到原型对象上的属性和方法(但是只有在使用简洁表示法的的时候才生效)
作用:是访问到对象的原型;可以访问和调用一个对象的父对象上的函数;
 
            //super关键字,它可以访问到原型对象上的属性和方法
//要注意的是,对象只有使用简洁表示法的时候super关键字才能访问原型属性
const obj = {name:'xiaoming'};
const cObj = {
//如果写成say:function(){}或者箭头函数say:()=>{}是不能使用super的,会报错
say(){
console.log(`My name is ${super.name}`);
}
}
Object.setPrototypeOf(cObj,obj);
cObj.say();

this关键字是指向函数所在的当前对象,

ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象。
 
 

ES6对象扩展——部分新的方法和属性的更多相关文章

  1. ES6对象扩展

    前面的话 随着JS应用复杂度的不断增加,开发者在程序中使用对象的数量也在持续增长,因此对象使用效率的提升就变得至关重要.ES6通过多种方式来加强对象的使用,通过简单的语法扩展,提供更多操作对象及与对象 ...

  2. ES6(对象扩展)

    ES6(对象(object)新增特性) 1.简介表示法 o,k 为属性:这种为无方法的情况. 这种为有方法. 2.属性表达式 ES6中,[a]就是 b . 3.新增API 1.数组也是引用类型 2.O ...

  3. es6 对象浅拷贝的2种方法

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. Easyui扩展或者重载(方法和属性)

    1: 使用$.fn.datagrid.defaults.editors重载默认值. 每个编辑器都有以下方法: 名称 属性 描述 init container, options 初始化编辑器并返回目标对 ...

  5. ES6 - 对象扩展(增强字面量)

    /** * 对象的扩展 * * 增强对象字面量 * * 解决问题:缩减代码 */ { /** * 1.属性简表示法 * 变量foo直接写在大括号里面.这时,属性名就是变量名, 属性值就是变量值 */ ...

  6. ES6 对象扩展

    1.属性和变量可以简写 let birth = '2000/01/01'; const Person = { name: '张三', //等同于birth: birth birth, // 等同于he ...

  7. ES6对象扩展——扩展运算符

    1.复制对象:使用扩展运算符复制对象时是浅拷贝 //复制对象:使用扩展运算符复制对象时是浅拷贝 const obj1 = { a:1, b:2, d:{ aa:1, bb:2 } } const ob ...

  8. 当调用对象中不存的方法、属性时,__getattr__的应用场景

    一.Python中创建类和实例的调用顺序 new(cls) 创建对象前调用,如果类中没定义,会一直向父类找,直到object的 new 方法创建类.cls代表类本身 init(self) 创建类实例后 ...

  9. ES6中数组的新方法

    数组的扩展 1.1扩展运算符 1.1.1:... 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. <body> < ...

随机推荐

  1. 高性能内存图数据库RedisGraph(三)

    这篇文章,我将介绍截止目前,RedisGraph的最新版本(v2.4)对Cypher语言的支持情况. 1.模式(patterns) RedisGraph已支持Cypher中所有的模式. 2.类型(ty ...

  2. 使用Elastic Job的分片配置加速任务执行和提高资源利用率

    上一篇,我们介绍了如何使用Elastic Job实现定时任务.解决了使用@Scheduled来实现时候存在的竞争问题,同时也实现了定时任务的高可用执行. 然而,还有一类问题是我们在做定时任务时候容易出 ...

  3. SpringBoot+ELK日志系统搭建

    一.ELK是什么 "ELK"是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kibana.Elasticsearch 是一个搜索和分 ...

  4. OOP-Klass模型 简略

    class Model { public static int a = 1; public int b; public Model(int b) { this.b = b; } } public st ...

  5. Django < 2.0.8 任意URL跳转漏洞(CVE-2018-14574)

    影响版本 Django < 2.0.8 抓包 访问http://192.168.49.2:8000//www.example.com,即可返回是301跳转到//www.example.com

  6. 四、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的13示例

    上一篇之分析了示例,没有最终写DEMO,把这一篇分析完,总结后一起写Prism下的MVVM例子. 这一篇开始分析从13示例开始,分析到MVVM主要部分结束然后写一个分析后的总结DEMO 添加一段新的内 ...

  7. 2020年度钻石C++C学习笔记(1)《博学谷》

    1.C语言概述 1.1 什么是C语言 一提到语言这个词语,自然会想到的是像英语.汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具. 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交 ...

  8. 阿里三面Android开发岗都过了,但是无理由挂了,竟是HR骚操作?

    进入互联网大厂一般都是"过五关斩六将",难度堪比西天取经,但当你真正面对这些大厂的面试时,有时候又会被其中的神操作弄的很是蒙圈. 近日,某位程序员发帖称,自己去阿里面试Androi ...

  9. 原生js 以ajax(post)的方式传json至php,并让php解析为数组

    如题. 比如要把一个json,如 json= {name:"John Rambo", time:"3pm"},,通过js ,传到一个php服务器 fwq.php ...

  10. 【Lua篇】静态代码扫描分析(四)规则检查

    一.前言 通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查.下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图 ...