属性与方法的简洁表示法
var birth = '2000/01/01';
var Person = {
name: '张三',
//等同于birth: birth
birth,
// 等同于hello: function ()...
hello() { console.log('我的名字是', this.name); }
};
//返回值的简写
function getPoint() {
var x = 1; var y = 10;
return {x, y};
}
getPoint()
// {x:1, y:10}
//commonjs变量输出
module.exports = { getItem, setItem, clear };
// 等同于
module.exports = {
getItem: getItem,
setItem: setItem,
clear: clear
};
//get set的写法
var cart = {
_wheels: 4,
get wheels () { return this._wheels; },
set wheels (value) {
if (value < this._wheels) {
throw new Error('数值太小了!');
}
this._wheels = value;
}
}
属性表达()
var lastWord = 'last word';
var a = {
'first word': 'hello',
[lastWord]: 'world'};
a['first word'] // "hello"
a[lastWord] // "world"
//好怪
a['last word'] // "world"
Object.is()
用于比较两个值是否相等
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
自行实现,可采用如下代码
Object.defineProperty(Object, 'is', {
value: function(x, y) {
if (x === y) {
// 针对+0 不等于 -0的情况
return x !== 0 || 1 / x === 1 / y;
}
// 针对NaN的情况
return x !== x && y !== y;
},
configurable: true,
enumerable: false,
writable: true}
);
Object.assign()
用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
var target = { a: 1, b: 1 };
var source1 = { b: 2, c: 2 };
var source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
如果该参数不是对象,则会先转成对象,然后返回。
typeof Object.assign(2)
Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)。
常见用途:
- 为对象添加属性
class Point {
constructor(x, y) {
Object.assign(this, {x, y});
}
}
- 为对象添加方法
Object.assign(SomeClass.prototype, {
someMethod(arg1, arg2) { ··· },
anotherMethod() { ··· }
});
// 等同于下面的写法
SomeClass.prototype.someMethod = function (arg1, arg2) { ···};
SomeClass.prototype.anotherMethod = function () { ···};
- 克隆对象
function clone(origin) { return Object.assign({}, origin);}
采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。
function clone(origin) {
let originProto = Object.getPrototypeOf(origin);
return Object.assign(Object.create(originProto), origin);
}
- 合并多个对象
const merge = (target, ...sources) => Object.assign(target, ...sources);
- 为属性指定默认值
const DEFAULTS = { logLevel: 0, outputFormat: 'html'};
function processContent(options) {
options = Object.assign({}, DEFAULTS, options);
}