zoukankan      html  css  js  c++  java
  • 对象属性

    创建对象方式:

    1 var person = new Object();
    2 person.name = "Nicholas";
    3 person.age = 29;
    4 person.job = "Software Enginner";
    5 
    6 person.sayName = function(){
    7         alert(this.name);
    8 };

    或者

    1 var person = {
    2       name: "Nicholas",
    3       age: 29,
    4       job: "Software Engineer",
    5 
    6       sayName: function(){
    7             alert(this.name);
    8       }
    9 };

    属性类型:

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

    1、数据属性:(4个)

    [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。

    [[Enumerable]]:表示能否通过for-in循环返回属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。

    [[Writable]]:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。

    [[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入数据值的时候,把新值保存在这个位置。这个特性的默认值为undefined。

    要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象属性的名字和一个描述符对象。其中,描述符(descriptor)对象的属性必须是:configurable、enumerable、writable和value。设置其中的一或多个值,可以修改对应的特性值。

    exp:

    1 var person = {};
    2 Object.defineProperty(person,"name",{
    3         writable:false,
    4         value:"Nicholas"
    5 })
    6 
    7 alert(person.name);        //"Nicholas"
    8 person.name = "Greg";
    9 alert(person.name);        //"Nicholas"

    writable设置为false,name属性的值不可修改。

    注意:一旦把属性定义为不可配置的,就不能再把它变回可配置了。即把configurable设置为false,此时再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误。

    2、访问器属性:(4个)

    [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。

    [[Enumerable]]:表示能否通过for-in循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为true。

    [[Get]]:在读取属性时调用的函数。默认值为undefined。

    [[Set]]:在写入属性时调用的函数。默认值为undefined。

    访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

    exp:

     1 var book = {
     2     _year:2004,
     3     edition:1
     4 };
     5 
     6 Object,defineProperty(book,"year",{
     7         get:function(){
     8             return this._year;
     9         },
    10         set:function(newValue){
    11             if(newValue > 2004){
    12                     this._year = newValue;
    13                     this.edition += newValue - 2004;
    14             }
    15         }
    16 });
    17 
    18 book.year = 2005;
    19 alert(book.edition);    //2
    定义多个属性:

    Object.defineProperties()方法。这是方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。

    exp:

    
    
    var book = {};
    
    Object.defineProperties(book,{
            _year:{
                writable:true,
                value:2004
            },
            
            edition:{
                writable:true,
                value:1
            },
    
            year:{
                get:function(){
                    return this._year;
                },
    
                set:function(newValue){
                    if(newValue > 2004){
                        this._year = newValue;
                        this.edition += newValue - 2004;
                    }
                }
            }
    });
     
    读取属性的特性:

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

    exp:

     1 var book = {};
     2 
     3 Object.defineProperties(book,{
     4         _year:{
     5             writable:true,
     6             value:2004
     7         },
     8         
     9         edition:{
    10             writable:true,
    11             value:1
    12         },
    13 
    14         year:{
    15             get:function(){
    16                 return this._year;
    17             },
    18 
    19             set:function(newValue){
    20                 if(newValue > 2004){
    21                     this._year = newValue;
    22                     this.edition += newValue - 2004;
    23                 }
    24             }
    25         }
    26 });
    27 
    28 var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
    29 alert(descriptor.value);        //2004
    30 alert(descriptor.configurable);    //false
    31 alert(typeof descriptor.get);    //"undefined"
    32 
    33 var descriptor = Object.getOwnPropertyDescriptor(book,"year");
    34 alert(descriptor.value);        //undefined
    35 alert(descriptor.enumerable);        //false
    36 alert(typeof descriptor.get);     //"function"
  • 相关阅读:
    _MSC_VER
    git之撤销修改
    vi/vim如何添加或删除多行注释
    C++ 读取文件数据和输出数据到文件
    git上传本地单独修改的文件
    Git学习笔记
    C++中类的声明
    linux中ldconfig的使用介绍
    #define 和 typedef 中的##
    find、xargs、grep基本用法
  • 原文地址:https://www.cnblogs.com/Yvette1014/p/5424617.html
Copyright © 2011-2022 走看看