原来JavaScript也可以有属性的get和set

今天在群里和大大们讨论问题, 顺便就谈到了开发 Prever 2 的时候遇到的一个. 归结下来, 就是希望能保护一些对象, 使之不能被修改.
后来Franky大神提到一个方法, Object.defineProperty, 据说是IE8部分支持, 其他浏览器的最新应该都是支持的. 因为我现在不求兼容很多浏览器, 所以对我来说, 这自然是非常有用的东西了.
查了查MSDN和MDC, 解释如下(翻译得不恰当的地方请见谅):

语法

Object.defineProperty(obj, prop, descriptor)

参数

obj
要定义属性的对象
prop
要修改或者定义的属性名称
descriptor
属性定义和修改的描述符

描述

这个方法允许对象属性的严格添加和修改. 普通的属性添加创建的属性可以在属性枚举(for…in 循环)中枚举, 这时候, 值可能被改变或者删除. 这个方法允许修改这些额外的特性(即可改变或可删除).

属性描述符是对象形式的, 它可以由两种方式表示: 数据描述符和访问描述符. 数据描述符是一个有值, 可写或者不可写的属性. 访问描述符是通过一个getter和setter函数对来描述的. 一个描述符必须是这两种之一, 不能掺杂. 这两种描述符都可以使用configurable和enumerable.

一个属性描述符是一个具有以下字段的对象:

value
属性的值. (仅限数据描述符). 默认为undefined.

writable
如果值为true, 属性的值可以被改变. (仅限数据描述符). 默认是false.

get
属性的getter, undefined表示没有getter. (仅限访问描述符). 默认是undefined.

set
属性的setter, undefined表示没有setter. (仅限访问描述符). 默认是undefined.

configurable
如果值为true, 则该属性的描述符可以被修改并且该属性可以从相关对象上删去. 默认为false.

enumerable
如果只为true, 则该属性可以从相关对象上枚举. 默认是false.

JS类的技巧 在初始化对象前添加属性

写Prever Start的时候,曾遇到过这样的问题,就是通过new关键字实例化一个对象,却希望它的原型在运行之前能具备一些外来的属性,可惜的是像这样:

var obj=new myClass();

只有一个语句,怎么添加这些属性呢?

这个我们需要从JS中类实例化的实现原理上来讲了(声明,我也只是听说,但的确管用)。听群里的高手说,上面的那个语句就等价于

var obj={};
myClass.call(obj);

我就不解释意思了,很明显的,两个代码之间的间隔给我们的操作提供了可能。

var obj={};
//在这里添加,如:
obj.ID=123;
myClass.call(obj);

不过我想一般可能用不到这样的写法,但既然曾经用到过就有它的价值,在此分享下。