ES6个人笔记记录——对象扩展

1.取值函数,存值函数

const obj = {
	get foo(){},
	set foo(x){}
}

// console.log(obj.foo.name);
const descriptor = Object.getOwnPropertyDescriptor(obj,'foo');
console.log(descriptor.get.name,descriptor.set.name);

2.Object.is()

ES5比较相等只用两个运算符"=="和"==="
前者会自动转换数据类型
后者NaN不等于NaN,以及+0等于-0

ES6提出了同值相等算法
console.log(Object.is(+0,-0),(+0 === -0),Object.is(NaN,NaN),(NaN === NaN));

3.Object.assign()

用于将源对象的所有可枚举属性复制到目标对象
PS:
	1.只复制源数据的自身属性(不包括继承的属性)
	2.也不复制不可枚举的属性(emumerable:false)
	3.实行的是浅复制
let target = {a : 1},
	source1 = {b : 2},
	source2 = {c : 3} 
console.log(Object.assign(target,source1,source2),target);

4.对象的引用

let tar1 = {
	a:{
		b : 'c',
		d : 'e'
}},
	sou1 = {
		a:{
			b : 'hello'
		}
	};
console.info(Object.assign(tar1,sou1));
常见用途:
	1.为对象添加属性
	2.为对象添加方法
	3.克隆对象
	4.合并多个对象
	5.为属性指定默认值
// 1
class Point{
	constructor(x,y){
		Object.assign(this,{x,y});
	}
}
// 2
Object.assign(SomeClass.prototype,{
	someMethod(arg1,arg2){
		...
	},
	anothorMethod(...args){
		...
	}
});
// 3
function clone(origin){
	let originProto = Object.getPrototypeOf(origin);
	return Object.assign(Object.create(originProto),origin);
}
// 4
// 将多个对象合并到某个对象
const merge1 = (target,...sources) => Object.assign(target,...sources);
// 如果希望合并后返回一个新对象,可以改写还能输,对一个空对象合并
const merge2 = (...sources) => Object.assign({},...sources);
描述对象的enumerable 属性称为“ 可枚举性 ”
如果该属性为false, 就表示某些操作会忽略当前属性。

ESS有3 个操作会忽略enumerable为false的属性。
	1.for ... in循环: 只遍历对象自身的和继承的可枚举属性。 
	2.Object. keys (): 返回对象自身的所有可枚举属性的键名。 
	3.JSON. stringify (): 只串行化对象自身的可枚举属性。

5.属性的遍历

for...in
Object.keys(obj)
Object.getOwnPropertyNames(obj)
Object.getOwnPropertySymbols(obj)
Reflect.ownKeys(obj)

6.__proto__属性

// ES5
let obj = Object.create(someOtherObj);
obj.method = function(){...};
// ES6
let obj = {
	method : function(){...};
};
obj.__proto__ = someOtherObj;

// Object.setPrototypeOf()
// 用来设置一个对象的prototype对象,返回参数对象本身
// 是ES6正式推荐的设置原型对象的方法
// 格式
// Object.setPrototypeOf(Object,prototype);
// 用法
// let o = Object.setPrototype({},null);

// eg
let proto = {};
let obj = { x : 10 };
Object.setPrototypeOf(obj,proto);

proto.y = 20;
proto.z = 40;

console.log(obj.x,obj.y,obj.z,obj.__proto__);

7.Object.keys() Object.values() Object.entries()

let { keys,values,entries } = Object;
let obj1 = {'a' : 1,'b' : '3','c' : 2};

for(key of keys(obj1)){
	console.log(key);
}

for(value of values(obj1)){
	console.log(value);
}

for(entry of entries(obj1)){
	console.log(entry);
}

// entries用途
// 1.遍历对象的属性
// 2.将对象转为真正的Map结构
let obj2 = { foo : 'bar',baz : 42 };
let map1 = new Map(entries(obj2));
console.log(map1)

let arr1 = [1,2,3,4,5];
for(let i in arr1){
	console.log(arr1[i])
}
for(let i of arr1){
	console.log(i)
}

8.Object.getOwnPropertyDescriptors()

// ES5:返回某个对象属性的描述对象(descriptor)
console.log("ES5",Object.getOwnPropertyDescriptor(obj2,'foo'));
// ES6:返回指定对象所有自身属性(非继承属性)的描述对象
console.log("ES6",Object.getOwnPropertyDescriptors(obj2,));

9.Null传导运算符 ?.

const firstName = (message 
	&& message.body 
	&& message.body.user
	&& message.body.user.firstName) || 'default';

const firstName = message?.body?.user?.firstName || 'default';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值