JS 面向对象的程序设计思想(1)深入理解JS对象
1、js的中没有OO语言中的'类'的概念。ECMAjs中把对象定义为:‘无序属性的集合,其属性可以包含基本值,对象或函数’。
2、ECMAScript中为对象定义了一组只有内部可以使用的属性,这些属性的目的是为了描述外部定义的属性的各种特征。这些特征是为了实现JS引擎用的,
因此再JS中不能不能直接访问它们。为了表示这个特性是内部值,把他们放到了两对中括号中,例如[[Enumerable]]。
数据属性:
[[Configurable]]:可配置性,默认为true,描述这个数据属性是否可以被delete,从而重新定义属性、描述了能否修改属性的特性,能否把属性改为访问器属性
[[Enumerable]]:可遍例(for-in)性,默认为true。
[[Writable]]:可修改性。默认为true
[[Value]]::在此保存数据。默认为undefined.
var person = {}; Object.defineProperty(person, "name", {//要修改属性的默认特性。必须使用Object.definedProperty() writable: false; value: 'Nicholas' }); alert(person.writable);//Nicholas person.name = 'wang'; alert(person.writable);//Nicholas
访问器属性:(不包含数据值,包含一对getter,setter函数)
[[Configurable]]:可配置性,默认为true,描述这个属性是否可以被delete,从而重新定义属性、描述了能否修改属性的特性,能否把属性改为访问器属性
[[Enumerable]]:可遍例(for-in)性,默认为true。
[[Get]]:在读取属性时调用的函数。默认值为undefined
[[Set]]:在写入属性时调用的函数。默认值为undefined
var person={ _age = 10, addAge = 1 }; Object.defineProperty(person, 'age',{ get: function(){ return this._age; }, set: function(newValue){ if(newValue > 10){ _age = newValue; addAge = newValue - 10; } } }); person.age = 12; alert(person.addAge);//2
除了一次性修改一个属性的特性方法:Object.defineProperty();还有另一个更加强大的方法:Object.defineProperties();可以一次性修改多个属性的特性。
var book = {}; Object.defineProperties(book, { _year: { value: 2004 },edition: { value: 1 },year:{ get: function(){ return this._year; },set: function(newValue){ if(newValue > 2004){ this._year = newValue; this.edtion += newValue - 2004; } } } }); book.year = 2005; alert(book.edition);//2