物件建立與拷貝--new運算子、Object.create、Object.assign、Object.defineProperty
阿新 • • 發佈:2018-12-11
- 物件建立方式 (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)淺拷貝,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; }