javascript - 面向对象 – 对象、对象属性

 

创建javascript对象可以通过两种方式:创建Object对象和创建字面量对象。

  1. /**
  2.      * 面向对象
  3.      */
  4.  
  5.     /** 创建对象 **/
  6.     var person = new Object();
  7.     person.name = "Nicholas";
  8.     person.age = 29;
  9.     person.job = "Soft Engineer";
  10.  
  11.     person.sayName = function() {
  12.     console.log(this.name);
  13.     };
  14.  
  15.     /** 字面量方式 **/
  16.     var person1 = {
  17.         name: "Nicholas",
  18.         age: 29,
  19.         job: "Soft Engineer",
  20.  
  21.         sayName: function() {
  22.             console.log(this.name);
  23.         }
  24.     };

Javascript 对象属性的特性

    对象的属性特性,可以通过Object.defineProperty(object, property, descritor)设置:

  • configurable ,属性是否可配置。可配置的含义包括:是否可以删除属性( delete ),是否可以修改属性的 writable enumerable  configurable 属性。
  • enumerable ,属性是否可枚举。可枚举的含义包括:是否可以通过 for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称。
  • writable ,属性是否可重写。可重写的含义包括:是否可以对属性进行重新赋值。
  • value ,属性的默认值。

    使用Object.defineProperty方法定义configurable enumerable writable 特性时,没有指定的特性默认是false

  1. //"use strict"; //严格模式
  2.     /**
  3.      * 面向对象 - 对象属性的数据属性
  4.      * 数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性4个特性: Configurable, Enumerable, Writable, Value 。
  5.      * Configurableb 表示是否能修改属性的其它特性,或使用delete删除属性,默认为true。
  6.      * Enumerable 是否能通过for in 循环列举出对象的该属性,默认true。
  7.      * Writable 能否修改属性的值(也即是下面的Value值),默认true。
  8.      * Value 表示属性的数据值,默认是undefined(未赋值)
  9.      */
  10.  
  11.     // 创建一个对象
  12.     var person = {
  13.         name: "Nicholas"
  14.     };
  15.  
  16.     /**
  17.      * 上面创建了一个名称为person的对象,属性name的4个特性:Configurable(true),Enumerable(true), Writable(true), Value("Nicholas")。
  18.      */
  19.  
  20.     /**
  21.      * 修改属性的默认特性,Object.defineProperty(obj, propertyName, descObj)
  22.      * 接受3个参数:属性所在对象,属性名,属性特性描述符对象,如下
  23.      */
  24.  
  25.     Object.defineProperty(person, "name", {
  26.         writable: false, // 是否能修改name属性,false 即是只读状态
  27.         value: "Nick"
  28.     });
  29.  
  30.     console.log(person.name); //Nick
  31.  
  32.     //属性特性writable设置为false,这里无法修改name属性的值,严格模式下会抛出不会出现报错。非严格模式会被忽略,name还是Nick。
  33.     person.name = "James"; // 设置无效
  34.  
  35.     console.log(person.name); // Nick
  36.  
  37.     Object.defineProperty(person, "name", {
  38.         writable: true
  39.     });
  40.  
  41.     person.name = "James";
  42.     console.log(person.name); //James
  43.  
  44.     /**
  45.      * configurable 一旦将属性设置为false,将不能在设置为true
  46.      */
  47.  
  48.     Object.defineProperty(person, "name", {
  49.         configurable: false // 不能通过delete删除属性
  50.     });
  51.     // 抛出错误
  52.     /**
  53.     Object.defineProperty(person, "name", {
  54.         configurable: true
  55.     }); **/
  56.  
  57.     delete person.name; // 非严格模式无效,严格模式抛错
  58.     console.log("name = " + person.name);

     

  •  set ,一旦属性被重新赋值,此方法被自动调用。
  •  get ,一旦属性被访问读取,此方法被自动调用。
  1. var book = {
  2.         _year: 2004,
  3.         edeition: 1
  4.     };
  5.  
  6.     // 定义属性year,用来访问_year
  7.     Object.defineProperty(book, "year", {
  8.         get: function() {
  9.             console.log("execute get");
  10.             return this._year;
  11.         },
  12.         set: function(newValue) {
  13.             console.log("execute set");
  14.             if (newValue > 2004) {
  15.                 this._year = newValue;
  16.                 this.edeition += newValue - 2004;
  17.             }
  18.         }
  19.  
  20.     });

     

    对象的属性特性:数值特性和访问器特性。数值特性configurableenumerablewritablevalue,代表值和状态。访问器特性没有值,只有一对方法getset

     

     

     

     

posted @ 2015-12-04 15:17  學亦漫長  阅读(153)  评论(0编辑  收藏  举报