javascript 高级程序设计 九

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