`
weigang.gao
  • 浏览: 467442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

面向对象程序设计(5)

 
阅读更多

面向对象的语言有一个标志,那就是它们都有类的概念。而通过类可以创建任意多个具有相同属性和方法的对象。前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。

 

ECMAScript-262把对象定义为:无序属性的集合,其属性可以包含基本值,对象或者函数。

严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。

每个对象都是基于一个引用类型创建的,这个引用类型可以是原生类型,也可以是开发人员定义的类型。

 

属性类型

ECMAScript中有两种属性:数据属性和访问器属性

 

1.数据属性(property的属性)

要修改属性默认的特性,必须使用ECMAScript 5Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象,属性的名字和一个描述符对象。IE8ECMAScript3支持的很好,对ECMAScript5的新特性并不支持。所以如果你使用的是IE8,那么就不能是用Object.

defineProperty()方法。

 

区分:

情景1:属性name的特性configurable,enumerablewritable特性的默认值都是true。但是调用Object.defineProperty()方法时,如果不指定,configurable, enumerablewritable特性的默认值都是false

<script type="text/javascript">
           var person = {name : '高红成'};
           alert(person.name);//高红成
           delete(person.name);
           alert(person.name);//undefined
 </script>

 

情景2

<script type="text/javascript">
           var person = {name : '高红成'};
           Object.defineProperty(person,”name”, {});
           alert(person.name);//高红成
           delete(person.name);//因为configurable为false
           alert(person.name);//高红成
</script>

 

 

2.访问器属性

访问器属性不包含数据值;它们包含一个gettersetter函数(不过,这两个函数都不是必需的)。在读取访问器属性时,会调用getter函数,这个函数负责返回有效值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。

 

访问器属性不能直接定义,必须使用Object.defineProperty()来定义。看下面的例子。

script type="text/javascript">
            var book = {
                 _year : 2004,/*_year前面的下划线是一种常用的标记,下划线必须,用于表示只能通过对象方法访问属性*/
                 edition : 1
            };
/*在IE9+中使用Object.defineProperty(),
在IE8-中使用book.__defineSetter__(“year”, {})和book.__defineGetter__(),eg:
       var book = { _year : 2001};
       book.__defineSetter__('year',function(newvalue){
                   if(newvalue > 2004){
                         this._year = newvalue;
                         this.edition += newvalue - 2004;
                    }
        });
*/
        Object.defineProperty( book, "year", {
           
             set : function(newvalue){
                    if(newvalue > 2004){
                         this._year = newvalue;
                         this.edition = newvalue - 2004;
                     }
              },
              get : function(){
                   return this._year;
              }
        });
        book.year = 2012;//year前面不需要加下划线”_”,这样会调用访问器方法来设置值
        alert(book.year);
        alert(book.edition);
</script>

 

 

3.读取属性的特性

使用ECMAScript5Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接受两个参数:属性所在的对象和要读取其描述符的属性名称。返回一个对象,如果是访问器属性,这个对象的属性有configurable,enumerable, get set;如果是数据属性,这个对象的属性有configurable, enumerable, writablevalue

<script type="text/javascript">
             var book = {year : 2010};
             var descriptor = Object.getOwnPropertyDescriptor(book, "year");
             alert(descriptor.value);
             alert(descriptor.configurable);  
</script>

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics