欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

es6之Object扩展及内部属性的总结

程序员文章站 2022-05-08 13:49:22
对象扩展: 1、Object.is(A,B) :比较两个值是否相等,取代 运算;只要值相等代表相等;其中NAN和NAN相等;+0和-0不相等; 2、Object.assign(target,source1,source2.......) :合并源对象的所有可枚举属性到目标对象;同名属性后覆盖前;ju ......

对象扩展:

1、object.is(a,b) :比较两个值是否相等,取代===运算;只要值相等代表相等;其中nan和nan相等;+0和-0不相等;

2、object.assign(target,source1,source2.......) :合并源对象的所有可枚举属性到目标对象;同名属性后覆盖前;just one obj,return this obj;【仅一个参数】将源目标非对象先转化为对象,无法转化的将会报错undefined;null;【多个参数】不在首参数为数值、字符串、布尔值、undefined、null均不会复制;只拷贝源对象的自身属性,不拷贝继承属性;【浅拷贝】

注意⚠️:object.assign处理数组,相同下标的元素后者覆盖前者

    对于取值函数的合并,会先求取值之后合并;取值函数get foo(){return 1} -> foo:1

    es6规定:class的原型均为不可枚举

使用:

/**
* 为对象添加属性
*/
class untils {
constructor(x, y) {
object.assign(this, x, y) // 通过object.assign方法将x,y添加到untils的实例上
}
}
/**
* 为对象添加方法
*/
object.assign(someclass.prototype, {
method(x, y) {},
anothermethod() {}
})
/**
* 克隆对象
*/
function clone(origin) {
return object.assign({}, origin)
}
/**
* 合并多个对象
*/
(target, ...source) => object.assign(target, ...source)
/**
* 为属性指定默认值
*/
const defaultopts = {
level: 3,
color: red
}
function addopts (opt) {
return object.assign({},defaultopts,opt) // defaultopts引用类型有问题
}
3、object.keys 遍历对象可枚举的属性的键名,返回数组;不含继承的属性、不含symbol属性【es5】取代for...in
4、object.values 遍历对象可枚举的属性的键值,返回数组;不含继承的属性、不含symbol属性 配合for...of使用
5、object.entries 遍历对象可枚举的属性的键值对,返回数组;不含继承的属性、含symbol属性的将忽略当前键值对 配合for...of使用
6、object.getownpropertydescriptor方法是为了解决object.assign对get set函数的拷贝值问题,set get无return的情况下,object.assign拷贝的值为undefined
7、object.defineproperties(obj,objproperty,descriptorobj) 修改对象属性默认特性【数据属性】的特定方法【es5】obj属性所在对象,属性名称,属性的描述符对象
8、object.setprototypeof 取代_proto_对原型的处理【写】
9、object.getprototypeof 取代_proto_对原型的处理【读】
10、object.create 取代_proto_对原型的处理【生成操作】方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__object.create({},obj)第二个obj是添加到新创建对象上面的可枚举属性,同时可配置描述符对象 详细可点击此链接查看https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/global_objects/object/create
11、super指向当前对象的prototype对象,只能用于对象的方法之中而不能用于对象方法的赋值操作【待总结继承时详述】
解构赋值:要求等号右边为对象,不能为undefined/null,解构赋值的参数需作为最后一位参数;对复合类型仅作为引用;
扩展运算符: ... 相当于object.assign 取出参数对象的所有可遍历属性拷贝到当前对象之中;

对象的内部属性:这些特性是为了实现javascript引擎

descriptor:描述对象【每个对象都有】通过object.getownpropertydescriptor(obj,'someproperty') 访问

数据属性:如下【还有一种是防问器属性】

enumerable: false 不可枚举

configurable: true 属性修改,可delete,修改为false之后无法再改变此描述符,再次修改 static mode会报错

writable:true 修改属性值
value 读取/写入新值 默认undefined

[[primitivevalue]] :原始值

_proto_ 用来读取及设置当前属性的prototype对象【ie11】在无法使用的内部属性时,es6提供了可供使用的对prototype的操作方法以上6、7、8