es6(基础十) 对象的扩展

一、属性的简洁表示法:在对象之中,直接写变量

{
	let a = "zhangsan";
	let obj = {
		a
	}
	console.info(obj.a);//zhangsan
}

二、属性名表达式

    使用字面量方式定义对象(使用大括号),在 ES5 中只能使用(标识符)定义属性

var obj = {
        foo:true,
        abc:123
}

    es6允许在字面量中用变量作key,即用[key]

{
	let foo = "max-vlan"
	let obj = {
		[foo]:22,//允许在字面量中用变量作key,即用[key]
		abc:123
	}
	console.info(obj["max-vlan"]);//22
	console.info(obj[foo]);//22
}

三、获取方法名

{
	let obj = {
		run(){
			return "我是run"
		}
	}
	console.log(obj.run.name);//run
}
四、Object.is():比较(与严格比较运算符(===)的行为基本一致)

不同之处只有两个:一是+0不等于-0,二是NaN等于自身

{
	console.info(34=="34")//true
	console.info(34==="34")//false
	console.info(Object.is(34,"34"))//false
	console.info(+0===-0)//true
	console.info(Object.is(+0,-0))//false
	console.info(NaN===NaN)//false
	console.info(Object.is(NaN,NaN))//true
}
五、assign
Object.assign方法用于对象的合并,
将源对象(source)的所有可枚举属性,复制到目标对象(target)

有点类似于$.extend

{
	const target = { a: 1,b:1 };
	const source1 = { b: 2 };
	const source2 = { c: 3 };
	console.info(Object.assign(target, source1, source2));//{a: 1, b: 2, c: 3}
	console.log(target);//{a: 1, b: 2, c: 3}
}

六、Object.getOwnPropertyDescriptor=>获取该属性的描述对象

{
	let obj = {
		a:1,
		b:23
	}
	console.info(Object.getOwnPropertyDescriptor(obj,'a'));
	//{value: 1, writable: true, enumerable: true, configurable: true}
	obj.enumerable = false;//反而会使得obj多个属性,所以通过这种方式设置不可枚举无效
	for(let k in obj){
		console.info(k);//a b enumerable
	}
}

//让对象的某个属性不可枚举
{
	function Tabs(){

	}
	Tabs.prototype = {
		constructor:Tabs,
		a:1,
		run(){

		}
	}
	let tab = new Tabs();
	console.info(tab.constructor);//用prototype导致constructor变成可枚举 ƒ Tabs() {}
	for( let k in tab){
		console.log(k);//constructor a run 
	}
	Object.defineProperty(tab,"constructor",{
		enumerable:false
	})

	for( let k in tab){
		console.log(k);//a run 
	}
}

七、Object.setPrototypeOf

{
	// let arr = [1,2,3];
	// arr.__proto__.aabb = 23;
	// console.info(arr.aabb)//不推荐该方式
	
	//正式推荐的设置原型对象的方法
	let proto = {};
	let obj2 = {a:2,b:4};
	Object.setPrototypeOf(obj2,proto);
	proto.x = 43;
	proto.y =23;
	console.info(proto);//{x: 43, y: 23}
	console.info(obj2);//{a: 2, b: 4} x与y存储在__proto__中
	console.info(obj2.x,obj2.y);//{x: 43, y: 23}
}

八、对象的遍历:
Object.keys()
Object.values()

Object.entries()

{
	let obj = {
		a:1,
		b:2,
		c:"23"
	}
	for(let key of Object.values(obj)){
		console.info(key);//1 2 23
	}
	//for in循环遍历对象的属性
	//当"对象"为数组时,属性指的是数组的"索引";
	//当"对象"为对象是,属性指的是对象的"属性"。
	console.info(Object.keys(obj));//(3) ["a", "b", "c"]
	for(let value in Object.keys(obj)){
		console.info(value)//数组索引=>0,1,2
	}
	for(let value of Object.keys(obj)){
		console.info(value);//a b c 
	}
	for(let [key,val] of Object.entries(obj)){
		console.info(key,val);//a 1,b 2,c 23
	}
}

猜你喜欢

转载自blog.csdn.net/u011705725/article/details/80760951