JavaScript中对象属性的定义

原文 标签 IT工具网 javascript

原问题:How to use javascript Object.defineProperty

提问者说,他对这一段代码感到不解:

Object.defineProperty(player,"health",{get:function() {
     return 10 + ( player.level * 15 );
}});

不解的原因是,他本来就可以直接访问player.level,为什么要使用Object.defineProperty定义一个属性来做这样的事。他觉得这是多此一举,希望有人给他讲讲这样做有什么理由。

Object Property

对于JavaScript变量来说,正常的属性添加通过赋值来创建并显示在属性枚举中(for…in 循环 或 Object.keys 方法)。这种方式添加的属性值可能被改变,也可能会被 删除。该方法允许改变这些额外细节的默认设置。

var obj = {}
obj.a = 1;
obj.b = 2;
var keys = Object.keys(obj);
console.log(keys);

delete obj.b;
for(var key in obj){
    console.log(key + ':' + obj[key]);
}

defineProperty

我们先来看这个方法的定义:Object.defineProperty()

Object.defineProperty(obj, prop, descriptor)

来看这两个参数: - prop - 需被定义或修改的属性名。 - descriptor - 需被定义或修改的属性的描述符。

对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。

数据描述符也就是我们常见的属性的值。它是一个拥有可写或不可写值的属性。存取描述符是由一对 getter-setter 函数功能来描述的属性。描述符必须是两种形式之一;不能同时是两者。也就是说,要么为prop指定数据描述符——赋值,要么为其指定存取描述符——指定getter/setter。

MDN链接页面里给出了很多具体的使用实例,请认真看。

总之,就是你可以使用Object.defineProperty(obj, prop, descriptor)方法来为obj定义一个属性的值,以及这个属性的描述符。

实际使用中,我一般是用它来设置一个类的只读属性和可读写属性。

// Read-Only properties
Object.defineProperty(this, 'data', { get: function() { return _data; } });

// Read-Write properties
Object.defineProperty(this, 'data', {
    get: function() { return _data; },
    set: function(value) { _data = value; }
});

相关文章:

JSON内容的HTTP Header该怎么填?

javascript - 如何避免JSON.stringify在特殊情况下返回undefined,并以这种方式为JSON.parse创建失败的字符串?

php - ajax没有收到与从php发送的相同的字符串

JavaScript对象序列化

在Java中声明数组

Java修饰符:public,protected,private,不加修饰符。有什么区别呢?

javascript - 来自nodejs的api请求

javascript - 单击iframe后,它会加载正在显示的页面

javascript - 用于在按钮点击时更改div高度的Javascript?