Javascript对象的数据属性和访问器属性

来源:互联网 发布:acr软件免费下载 编辑:程序博客网 时间:2024/05/17 22:50

之前看了Javascript Dom编程艺术,在第二章对javascript的语法功能介绍较少,于是又开始看了Javascript高级程序设计,感觉这本真是很不错啊,对知识讲解的很详细,对我这个初学者来说,很有收获。

不多说,先来谈谈对js类的体会,之前创建一个新类,赋予属性和方法,比如:
var person=new Object();    person.name="xuzhiwei";    person.showName=function(){      alert(this.name);    };    person.showName();

这样浏览器输出xuzhwei,这是以前老的方法,现在流行的创建类的方法是创建字面量方法:
var person={        name:"xuzhiwei",        showName: function () {            alert(this.name);        }    };    person.showName();

也能得到相同的结果。
然后是这次的重点,对象有两种属性:数据属性和访问器属性。

数据属性有四个:

Configurable,这个是表示能否用delete删除属性从而重新定义属性,默认值是true。
Enumerable:表示能否通过for-in循环访问属性,默认属性也是true。
Writable:表示对属性能否修改,默认还是true。
Value:表示这个属性的值是多少,因为一开始没有赋值,默认是undefined。
设置数据属性的方法是Object的方法:defineProperty,它接受三个参数:对象名字,要设置的属性名字,还有一个描述对象。
接下来看个小例子:
var person={        name:"xuzhiwei",        showName: function () {            alert(this.name);        }    };    Object.defineProperty(person,"name",{        value:"赵超",        writable:false    });    alert(person.name);
最后输出的结果是:赵超,可以发现将原来的值改变了,因为这里writable设置的是false,所以现在值是不可以修改了。

访问器属性:
get:在访问数据的时候(className.propertyName)调用的方法,默认undefined。
set:在给对象赋值的时候调用的方法,默认undefined。
访问器属性也是必须用Object的defineProperty方法调用,看下面的例子:
var person={        _name:"xuzhiwei",        editCount:0    };    Object.defineProperty(person,"name",{ //name表示接下来要访问的值,不是_name;        get: function () {            return this._name;        },        set: function (newValue) {            this._name = newValue;            this.editCount++;        }    });    alert(person.name);    person.name="李奇然";    alert(person.name+" "+person.editCount);

person对象的name由于加了_,不能直接访问,类似java的private属性。最后输出的是:李奇然 1。表示赋值也改变了editCount的值。
当然也可以只指定get,表示这个name只能读不能写,类似之前的writable:false。
当然还有defineProperties()方法,表示一次性定义多个属性,比如:
var person = {};    Object.defineProperties(person, {        _name: {            writable: true,            value: "赵超"        },        editCount: {            writable: true,            value: 0        },        name: {            get: function () {                return this._name;            }            ,            set: function (newValue) {                this._name = newValue;                this.editCount++;            }        }    })    ;    alert(person.name);    person.name = "李奇然";    alert(person.name + " " + person.editCount);

在这个例子中,一次性定义了多个属性,运行结果和之前的一样。只不过第一个对话框显示的是赵超。


1 0