element源码阅读之对象拷贝

68 阅读1分钟

看了element源码里的对象拷贝的方法如下:

function merge(target) {
    // arguments 收集所有的参数
    for (let i = 1, j = arguments.length; i < j; i++) {
      let source = arguments[i] || {};
      for (let prop in source) { 
        if (source.hasOwnProperty(prop)) {
          let value = source[prop];
          if (value !== undefined) {
            target[prop] = value;
          }
        }
      }
    }
  
    return target;
  };
  var a = {
    name: 'csx',
  }
  const b = {
    age: 18
  }
  var ab = merge({}, a,b);
  console.log(ab) // {name: 'csx', age: 18}

涉及到了for inhasOwnProperty知识点

for in 变量对象可枚举属性,包括继承来的

const triangle = { a: 1, b: 2, c: 3 };
function ColoredTriangle() {
  this.color = "red";
}
ColoredTriangle.prototype = triangle;
const obj = new ColoredTriangle();
for (const prop in obj) {
    console.log(`obj.${prop} = ${obj[prop]}`); 
    /* 打印内容如下,将继承来的  a b c属性也遍历出来了
    obj.color = red
    obj.a = 1
    obj.b = 2
    obj.c = 3
    */
}

for in 遍历属性时如何排除继承来的属性

const triangle = { a: 1, b: 2, c: 3 };
function ColoredTriangle() {
  this.color = "red";
}
ColoredTriangle.prototype = triangle;
const obj = new ColoredTriangle();
for (const prop in obj) {
 // if (Object.hasOwn(obj, prop)) {
  if (obj.hasOwnProperty(prop)) {
    console.log(`obj.${prop} = ${obj[prop]}`); 
    // obj.color = red  只有自身的color属性,a b c 继承来的排除掉了
  }
}

hasOwnProperty 判断是自身属性而不是继承的

const triangle = { a: 1, b: 2, c: 3 };

function ColoredTriangle() {
  this.color = "red";
}

ColoredTriangle.prototype = triangle;

const obj = new ColoredTriangle();  

console.log(obj.hasOwnProperty('color'))  // true   color是自身属性
console.log(obj.hasOwnProperty('a'))  // false
console.log(obj.hasOwnProperty('b')) // false
console.log(obj.hasOwnProperty('c')) // false