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

JS中的属性描述对象 3

作者: 诗和远方何你 | 来源:发表于2018-05-07 13:41 被阅读0次

可写性(writable)

可写性(writable)决定了属性的值(value)是否可以被改变。

var o = {};

Object.defineProperty(o, 'a', {
  value: 37,
  writable: false
});

o.a // 37
o.a = 25;
o.a // 37

上面代码将o对象的a属性可写性设为false,然后改变这个属性的值,就不会有任何效果。

注意,正常模式下,对可写性为false的属性赋值不会报错,只会默默失败。但是,严格模式下会报错,即使是对a属性重新赋予一个同样的值。

关于可写性,还有一种特殊情况。就是如果原型对象的某个属性的可写性为false,那么派生对象将无法自定义这个属性。

var proto = Object.defineProperty({}, 'foo', {
  value: 'a',
  writable: false
});

var o = Object.create(proto);

o.foo = 'b';
o.foo // 'a'

上面代码中,对象proto的foo属性不可写,结果proto的派生对象o,也不可以再自定义这个属性了。在严格模式下,这样做还会抛出一个错误。但是,有一个规避方法,就是通过覆盖属性描述对象,绕过这个限制,原因是这种情况下,原型链会被完全忽视。

Object.defineProperty(o, 'foo', {
  value: 'b'
});

o.foo // 'b'

Object.getOwnPropertyNames()

Object.getOwnPropertyNames方法返回直接定义在某个对象上面的全部属性的名称,而不管该属性是否可枚举。

var o = Object.defineProperties({}, {
  p1: { value: 1, enumerable: true },
  p2: { value: 2, enumerable: false }
});

Object.getOwnPropertyNames(o)
// ["p1", "p2"]

一般来说,系统原生的属性(即非用户自定义的属性)都是不可枚举的。

// 比如,数组实例自带length属性是不可枚举的
Object.keys([]) // []
Object.getOwnPropertyNames([]) // [ 'length' ]

// Object.prototype对象的自带属性也都是不可枚举的
Object.keys(Object.prototype) // []
Object.getOwnPropertyNames(Object.prototype)
// ['hasOwnProperty',
//  'valueOf',
//  'constructor',
//  'toLocaleString',
//  'isPrototypeOf',
//  'propertyIsEnumerable',
//  'toString']

上面代码可以看到,数组的实例对象([])没有可枚举属性,不可枚举属性有length;Object.prototype对象也没有可枚举属性,但是有不少不可枚举属性。

Object.prototype.propertyIsEnumerable()

对象实例的propertyIsEnumerable方法用来判断一个属性是否可枚举。

var o = {};
o.p = 123;

o.propertyIsEnumerable('p') // true
o.propertyIsEnumerable('toString') // false

上面代码中,用户自定义的p属性是可枚举的,而继承自原型对象的toString属性是不可枚举的。

相关文章

  • JS中的属性描述对象 3

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

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

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

  • 前端异常捕获

    1. JS Error 对象 在 Error 对象中主要有3个属性 name 错误名称 message 错误描述 ...

  • JS属性描述对象

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

  • JS中的属性描述对象 4

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

  • JS中的属性描述对象 5

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

  • JS中的属性描述对象 6

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

  • JS中的属性描述对象 1

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

  • JS中的属性描述对象 2

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

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

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

网友评论

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

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