JavaScript基础复习5-属性描述对象

  • 如果属性已经存在,Object.defineProperty()方法相当于更新该属性的属性描述对象。

  • 如果一次性定义或修改多个属性,可以使用Object.defineProperties()方法。

  • 注意,一旦定义了取值函数get(或存值函数set),就不能将writable属性设为true,或者同时定义value属性,否则会报错。

  • Object.defineProperty()Object.defineProperties()参数里面的属性描述对象,writableconfigurableenumerable这三个属性的默认值都为false

  • 对于writeablefalse的 在严格模式下,修改值报错,但是普通模式不报错,会默认失效.

  • 如果原型对象的某个属性的writablefalse,那么子对象将无法自定义这个属性。

  • var proto = Object.defineProperty({}, 'foo', {
      value: 'a',
      writable: false
    });
    
    var obj = Object.create(proto);
    
    obj.foo = 'b';
    obj.foo // 'a'
  • 但是,有一个规避方法,就是通过覆盖属性描述对象,绕过这个限制。原因是这种情况下,原型链会被完全忽视。

元属性

属性描述对象的各个属性称为“元属性”,因为它们可以看作是控制属性的属性。

enumberable

如果一个属性的enumerablefalse,下面三个操作不会取到该属性。

  • for..in循环
  • Object.keys方法
  • JSON.stringify方法

JSON.stringify方法会排除enumerablefalse的属性,有时可以利用这一点。如果对象的 JSON 格式输出要排除某些属性,就可以把这些属性的enumerable设为false

对象的拷贝

有时,我们需要将一个对象的所有属性,拷贝到另一个对象,可以用下面的方法实现。

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) {
    if (!from.hasOwnProperty(property)) continue;
    Object.defineProperty(
      to,
      property,
      Object.getOwnPropertyDescriptor(from, property)
    );
  }

  return to;
}

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

上面代码中,hasOwnProperty那一行用来过滤掉继承的属性,否则会报错,因为Object.getOwnPropertyDescriptor读不到继承属性的属性描述对象。


   转载规则


《JavaScript基础复习5-属性描述对象》 lttztt 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
JavaScript基础复习6-Array JavaScript基础复习6-Array
ArrayArray作为构造函数,行为很不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。 var a = new Array(3); var b = [undefined, undefined, undefined];
2018-11-05
下一篇 
JavaScript基础复习4-标准库 JavaScript基础复习4-标准库
Object对象JavaScript原生提供的Object.其他对象都继承自Object对象. Object对象的原生方法分成两类:Object本身的方法与Object的实例方法。 本身的方法: 定义在Object对象的方法 Object
2018-11-05
  目录