专栏名称: 前端JavaScript
分享 | 学习 | 交流 | 原创 分享是学习的开始;学习不必要从头开始,是从现在开始;交流能沟通你我,提高你的学识;期待你的加入!!! web前端技术交流,JavaScript,HTML5,CSS3……
目录
相关文章推荐
51好读  ›  专栏  ›  前端JavaScript

[S3-E435]深度挖掘 Object 对象的使用

前端JavaScript  · 公众号  · Javascript  · 2017-10-18 06:33

正文

请到「今天看啥」查看全文


Object.getOwnPropertyNames(Object.prototype)

Object.keys 返回一个对象的实例可枚举属性, 如果使用了Object.defineProperty改变了对象的某个属性, 则无法通过Object.keys返回属性进行遍历属性, 也无法使用 for-in循环。


var obj = {

foo: function () {}

};


// return ['foo']

Object.keys(obj);


Object.defineProperty(obj, 'foo', {

enumerable: false

});


// return []

Object.keys(obj);


// empty loop

for (var name in obj) {

console.log(name);

}


// return false

obj.hasOwnProperty('foo');

Object.getOwnPropertyNames() 返回自身实例属性名称, 无视enumerable: false


var obj = {

foo: function () {},

bar: 'hello world'

};


Object.defineProperty(obj, 'foo', {

// foo 已被定义, 所以需要显示设置 false

enumerable: false

});


Object.defineProperty(obj, 'foo2', {

value: function () {},

// foo2 未被定义, 默认enumerable为false

enumerable: true

});


// 'bar', 'foo2'

Object.keys(obj);


// 'foo', 'bar', 'foo2'

Object.getOwnPropertyNames(obj);


'foo' in obj // return true

in 操作符, 检查属性是否在能够获取, 无视属性


对象定义属性

  • Object.defineProperty

  • Object.getOwnPropertyDescriptor

属性描述一般是由enumrable, value, get, set, configurable, writeable, value 组成, 其中 get, set 与 value 为互斥关系


定义一个对象的描述

var obj = Object.create(null);


Object.defineProperty(obj, 'foo', {

value: 'foo',

configurable: false,

writeable: false,

enumerable: false

});


obj.foo = 'change foo';

console.log(obj.foo); // still foo


Object.defineProperty(obj, 'foo', {

writeable: true,

configurable: true

});


obj.foo = 'change foo 2';

console.log(obj.foo); // still foo

'foo' in obj; // return true

  • 一旦被定义了configureable: false, 那么后续再次 defineProperty时不会生效。

  • writeable: false 的情况下, 无法修改属性的 value 值


属性描述中的 value 与 get, set

var obj = Object.create(null);


// throw Error

// Uncaught TypeError: Invalid property descriptor.

// Cannot both specify accessors and a value or writable attribute

Object.defineProperty(obj, 'foo', {

value: 'foo',

set: function (val) {

// this 指向 obj

this._foo = val;

},

get: function () {

return this._foo;

}

});

因为 value 与 get, set 为互斥关系, 所以无法同时进行定义。


writeable 与 get, set

var obj = Object.create(null);


Object.defineProperty(obj, 'foo', {

// 失效

writeable: false,

set: function (val) {

// this 指向 obj







请到「今天看啥」查看全文


推荐文章
妙法佛音  ·  【心籁之音】耳与眼
8 年前
考研研学姐  ·  考研英语最佳答题顺序和时间分配策略
7 年前
北大清华讲座  ·  【原创】恰逢花落
7 年前