JavaScript < ES5、ES6、ES7、… >ECMAScript 6

ES6 对象扩展(7)

2018-12-15  本文已影响14人  CodeMT

前面的话


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

对象类别

1、普通(Ordinary)对象

2、特异(Exotic)对象

3、标准(Standard)对象

4、内建对象

对象简写

【属性初始值简写】

function createPerson(name, age) {
return{
name: name,
age: age
};
}

function createPerson(name, age) { return{
name,
age
};
}

【对象方法简写】

varperson ={
name: "Nicholas",
sayName: function() {
console.log(this.name);
}
};

varperson ={
name: "Nicholas",
sayName() {
console.log(this.name);
}
};

[注意]通过对象方法简写语法创建的方法有一个name属性,其值为小括号前的名称

可计算属性名

varperson ={},
lastName = "last name";
person["first name"] = "huochai";
person[lastName] = "match";
console.log(person["first name"]);// "huochai"console.log(person[lastName]);//
"match"

varperson = { "first name": "huochai"};
console.log(person["first name"]);// "huochai"

var lastName = "last name";varperson = { "first name": "huochai",
[lastName]: "match"};
console.log(person["first name"]);// "huochai"console.log(person[lastName]);//"match"

varsuffix = " name";varperson ={
["first" + suffix]: "huochai",
["last" + suffix]: "match"};
console.log(person["first name"]);// "huochai"console.log(person["last name"]);//"match"

判断相等

【Object.is()】

console.log(+0 === -0);//trueconsole.log(NaN === NaN);//false

console.log(+0 == -0);// trueconsole.log(+0 === -0);// trueconsole.log(Object.is(+0, -0));// falseconsole.log(NaN == NaN);// falseconsole.log(NaN === NaN);// falseconsole.log(Object.is(NaN, NaN));// trueconsole.log(5 == 5);// trueconsole.log(5 == "5");// trueconsole.log(5 === 5);// trueconsole.log(5 === "5");// falseconsole.log(Object.is(5, 5));// trueconsole.log(Object.is(5, "5"));// false

对象合并

【Object.assign()】

functionmixin(receiver, supplier) {
Object.keys(supplier).forEach(function(key) {
receiver[key] =supplier[key];
}); returnreceiver;
}

functionEventTarget() {/*...*/}
EventTarget.prototype ={
constructor: EventTarget,
emit: function() {/*...*/},
on: function() {/*...*/}
};varmyObject ={};
mixin(myObject, EventTarget.prototype);
myObject.emit("somethingChanged");

functionEventTarget() {/*...*/}
EventTarget.prototype ={
constructor: EventTarget,
emit: function() {/*...*/},
on: function() {/*...*/}
}varmyObject ={}
Object.assign(myObject, EventTarget.prototype);
myObject.emit("somethingChanged");

【对象合并】

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

vartarget = { a: 1, b: 1 };varsource1 = { b: 2, c: 2 };varsource2 = { c: 3};
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}

【浅拷贝】

Object.assign({b: 'c'},
Object.defineProperty({}, 'invisible', {
enumerable: false,
value: 'hello'
})
)// { b: 'c' }

varobj1 = {a: {b: 1}};varobj2 =Object.assign({}, obj1);
obj1.a.b = 2;
obj2.a.b // 2

属性名重复

"use strict";varperson ={
name: "huochai",
name: "match"// 在 ES5 严格模式中是语法错误};

"use strict";varperson ={
name: "huochai",
name: "match"};
console.log(person.name); // "match"

枚举顺序

varobj ={
a: 1, 0: 1,
c: 1, 2: 1,
b: 1, 1: 1};
obj.d = 1;
console.log(Object.getOwnPropertyNames(obj).join(""));// "012acbd"

对象原型

proto

// es6的写法varobj ={
method: function() { ... }
};
obj.__proto__ = someOtherObj;// es5的写法varobj =Object.create(someOtherObj);
obj.method =function() { ... };

【Object.getPrototypeOf()】

Object.getPrototypeOf(obj);

【Object.setPrototypeOf()】

// 格式Object.setPrototypeOf(object, prototype)// 用法varo = Object.setPrototypeOf({},null);

例子如下

let person ={
getGreeting() { return"Hello";
}
};
let dog ={
getGreeting() { return"Woof";
}
};// 原型为 personlet friend =Object.create(person);
console.log(friend.getGreeting()); // "Hello"console.log(Object.getPrototypeOf(friend) === person);// true// 将原型设置为 dogObject.setPrototypeOf(friend, dog); console.log(friend.getGreeting()); // "Woof"console.log(Object.getPrototypeOf(friend) === dog);// true

【简化原型访问的Super引用】

let person ={
getGreeting() { return"Hello";
}
};
let dog ={
getGreeting() { return"Woof";
}
};
let friend ={
getGreeting() { returnObject.getPrototypeOf(this).getGreeting.call(this) + ", hi!"; }
};// 将原型设置为 personObject.setPrototypeOf(friend, person); console.log(friend.getGreeting()); // "Hello, hi!"console.log(Object.getPrototypeOf(friend) === person);// true// 将原型设置为 dogObject.setPrototypeOf(friend, dog); console.log(friend.getGreeting()); // "Woof, hi!"console.log(Object.getPrototypeOf(friend) === dog);// true

let friend ={
getGreeting() { // 这相当于上个例子中的:
// Object.getPrototypeOf(this).getGreeting.call(this)
returnsuper.getGreeting() + ", hi!";
}
};

let friend ={
getGreeting: function() { // 语法错误
returnsuper.getGreeting() + ", hi!";
}
};

let person ={ getGreeting() { return"Hello"; } };// 原型为 personlet friend ={ getGreeting() { returnObject.getPrototypeOf(this).getGreeting.call(this) + ", hi!"; } }; Object.setPrototypeOf(friend, person);// 原型为 friendlet relative =Object.create(friend); console.log(person.getGreeting()); // "Hello"console.log(friend.getGreeting());// "Hello, hi!"console.log(relative.getGreeting());// error!

let person ={
getGreeting() { return"Hello";
}
};// 原型为 personlet friend ={
getGreeting() { returnsuper.getGreeting() + ", hi!";
}
};
Object.setPrototypeOf(friend, person);// 原型为 friendlet relative =Object.create(friend); console.log(person.getGreeting()); // "Hello"console.log(friend.getGreeting());// "Hello, hi!"console.log(relative.getGreeting());// "Hello, hi!"

方法定义

let person = { // 方法 getGreeting() { return"Hello"; } };// 并非方法function shareGreeting() { return"Hi!"; }

let person ={
getGreeting() { return"Hello";
}
};// 原型为 personlet friend ={
getGreeting() { returnsuper.getGreeting() + ", hi!";
}
};
Object.setPrototypeOf(friend, person);
console.log(friend.getGreeting()); // "Hello, hi!"

调用friend.getGreeting()方法会将person.getGreeting()的返回值与",hi!"拼接成新的字符串并返回。friend.getGreeting()方法的[[HomeObject]]属性值是friend,friend的原型是person,所以super.getGreeting()等价于Person.getGreeting.call(this)

对象遍历

【Object.keys()】

var obj = { foo: 'bar', baz: 42}; console.log(Object.keys(obj));// ["foo", "baz"]

let {keys, values, entries} =Object;
let obj = { a: 1, b: 2, c: 3 };for(let key of keys(obj)) {
console.log(key); // 'a', 'b', 'c'}for(let value of values(obj)) {
console.log(value); // 1, 2, 3}for(let [key, value] of entries(obj)) {
console.log([key, value]); // ['a', 1], ['b', 2], ['c', 3]}

【Object.values()】

var obj = { foo: 'bar', baz: 42};
console.log(Object.values(obj));// ["bar", 42]
Object.values()只返回对象自身的可遍历属性
varobj = Object.create({}, {p: {value: 42}});
console.log(Object.values(obj)); // []

varobj =Object.create({}, {p:
{
value: 42,
enumerable: true
}
});
console.log(Object.values(obj)); // [42]

【Object.entries()】

var obj = { foo: 'bar', baz: 42};console.log(Object.entries(obj));// [ ["foo", "bar"], ["baz", 42] ]

let obj = { one: 1, two: 2 };for(let [k, v] of Object.entries(obj)) { console.log( `${JSON.stringify(k)}: ${JSON.stringify(v)}` ); }// "one": 1// "two": 2

上一篇 下一篇

猜你喜欢

热点阅读