美文网首页
JS中的属性描述对象 5

JS中的属性描述对象 5

作者: 诗和远方何你 | 来源:发表于2018-05-09 14:53 被阅读0次

对象的拷贝

有时,我们需要将一个对象的所有属性,拷贝到另一个对象。ES5没有提供这个方法,必须自己实现。

var extend = function (to, from) {
  for (var property in from) {
    to[property] = from[property];
  }

  return to;
}

extend({}, {
  a: 1
})
// {a: 1}

上面这个方法的问题在于,如果遇到存取器定义的属性,会只拷贝值。

extend({}, {
  get a() { return 1 }
})
// {a: 1}

为了解决这个问题,我们可以通过Object.defineProperty方法来拷贝属性。

var extend = function (to, from) {
  for (var property in from) {
    Object.defineProperty(
      to,
      property,
      Object.getOwnPropertyDescriptor(from, property)
      //读取from上property属性的属性描述对象
    );
  }
  return to;
}

extend({}, { get a(){ return 1 } })
// { get a(){ return 1 } })

这段代码还是有问题,拷贝某些属性时会失效。

extend(document.body.style, {
  backgroundColor: "red"
});

上面代码的目的是,设置document.body.style.backgroundColor属性为red,但是实际上网页的背景色并不会变红。但是,如果用第一种简单拷贝的方法,反而能够达到目的。这提示我们,可以把两种方法结合起来,对于简单属性,就直接拷贝,对于那些通过属性描述对象设置的属性,则使用Object.defineProperty方法拷贝。

var extend = function (to, from) {
  for (var property in from) {
    var descriptor = Object.getOwnPropertyDescriptor(from, property);

    if (descriptor && ( !descriptor.writable
      || !descriptor.configurable
      || !descriptor.enumerable
      || descriptor.get
      || descriptor.set)) {
      Object.defineProperty(to, property, descriptor);
    } else {
      to[property] = from[property];
    }
  }
}

上面的这段代码,可以很好地拷贝对象所有可遍历(enumerable)的属性。

相关文章

  • JS中的属性描述对象 5

    对象的拷贝 有时,我们需要将一个对象的所有属性,拷贝到另一个对象。ES5没有提供这个方法,必须自己实现。 上面这个...

  • js中对象的属性描述对象

    1.概述 JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍...

  • JS属性描述对象

    概述 JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等...

  • JS中的属性描述对象 4

    存取器(accessor) 除了直接定义以外,属性还可以用存取器(accessor)定义。其中,存值函数称为set...

  • JS中的属性描述对象 6

    控制对象状态 JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是Ob...

  • JS中的属性描述对象 1

    JavaScript中的属性描述对象 JavaScript提供了一个内部数据结构,用来描述一个对象的属性的行为,控...

  • JS中的属性描述对象 2

    元属性 属性描述对象的属性,被称为“元属性”,因为它可以看作是控制属性的属性。 可枚举性(enumerable) ...

  • JS中的属性描述对象 3

    可写性(writable) 可写性(writable)决定了属性的值(value)是否可以被改变。 上面代码将o对...

  • js常用知识点总结-String对象

    js常用知识点总结-String对象 使用String对象: String对象属性: 属性描述constructo...

  • js常用知识点总结-Number对象

    js常用知识点总结-Number对象 使用Number对象: 对象属性: 属性描述constructor返回对创建...

网友评论

      本文标题:JS中的属性描述对象 5

      本文链接:https://www.haomeiwen.com/subject/brgnrftx.html