5.对象的扩展

属性与方法的简洁表示法

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);
}

你可能感兴趣的:(5.对象的扩展)