1. 程式人生 > >物件建立與拷貝--new運算子、Object.create、Object.assign、Object.defineProperty

物件建立與拷貝--new運算子、Object.create、Object.assign、Object.defineProperty

  1. 物件建立方式 (1)字面量 (2) new 運算子
// new 運算子實現
function NEW() {
  const func = arguments[0]; // 建構函式
  const params = [].slice.call(arguments, 1);  // 獲取傳入的引數,呼叫建構函式時使用
  // 繼承建構函式中的屬性
  const o = Object.create(func.prototype);
  // 執行建構函式
  func.call(o, ...params);
  // 返回物件
  return o;
}
(3)Object.create 方法
/**
		- 語法 Object.create(proto, [propertiesObject])
		- 引數 proto :新建立物件的原型物件
		- 引數 propertiesObject : 可選。包含一個或多個屬性描述符的 JavaScript 物件.
		- 返回值:一個新物件帶著指定的原型和屬性
		*/
Object.create = function (obj, properties) {
  function F() {}
  F.prototype = obj;
  let o = new F();
  /**
   * 注意Object.create可以傳入第二個引數,是一個物件,但格式必須是Object.defineProperties()方法一樣
   * {
   *    writable: true, // 屬性是否能被賦值運算子操作
   *    configurable: true, // 屬性是否可以被改變
   *    enumerable: true, // 屬性是否可以被列舉
   *    value: '', // 屬性對應的值
   *    get: function(){}
   *    set: function(){}
   * }
   */
  if (typeof properties === 'object') {
    Object.defineProperties(o, properties);
  }
  return o;
};
  1. 物件拷貝 (1)淺拷貝,Object.assign 屬於淺拷貝
function shadowCopy(obj) {
  const newObj = {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = obj[key];
    }
  }
}
(2)深拷貝
/**
 * @param obj:需要複製的物件
 * @param copy:複製完返回的物件
 */
function deepCopy(obj, copy = {}) {
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      copy[key] = Array.isArray(obj[key]) ? [] : {};
      deepCopy(obj[key], copy[key]);
    } else {
      copy[key] = obj[key];
    }
  }

  return copy;
}