• javascript高级编程笔记05(面向对象)


    面向对象设计

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

    • 数据属性:

    数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性

    1. [[Configurable]]:表示能否通过delete删除属性从而重新第一属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
    2. [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true
    3. [[Writable]]:表示能否修改属性的值,默认为true
    4. [[Value]]:包含这个属性的数据值默认为undefined

    要修改属性默认的特性,必须使用es5object.defineProperty方法,这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象,其中,描述符对象的属性必须是:configurableenumerablewritablevalue,设置其中一个或多个值,可以修改对应的特性值,例如:

    var person = {};
    Object.defineProperty(preson, "name", {
      weitable: false,
      Value: "Nicholas"
    });
    alert(person.name);//”Nicholas”
    person.name = "Greg";
    alert(person.name)//”Nicholas”

    注意:ie8是第一个实现object.defineProperty方法的浏览器版本,然而,这个版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器属性,由于实现不彻底,建议读者不要在ie8中使用此方法.

    • 访问器属性:

    访问器属性不包含数据值;他们包含一对gettersetter函数在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值,在写入访问器属性时,会调用setter函数并传入新值,访问器属性有如下4个特性

    1. [[Confingurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性
    2. [[Enumerable]]:表示能否通过for-in循环返回属性.
    3. [[Get]]:在读取属性时调用的函数,默认值为undefined
    4. [[Set]]:在写入属性时调用的函数,默认为undefined

    访问器属性不能直接定义,必须使用Objiect.defineProperty来定义.

    • l 定义多个属性

       由于未对象定义多个属性的可能性很大,es5又定义了一个Object.difineProperties方法,利用这个方法可以通过描述符一次定义多个属性,这个方法接收两个对象参数;第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应.

    例如:

    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.edition+=newValue-2004;
          }
        }
      }
    })
    • l 读取属性的特性

    es5Object.getOwnPropertyDescriptor方法,可以取得给定属性的描述符,这个方法接收两个参数:属性所在的对象和要读取描述的属性名称,返回值是一个对象,如果是访问器属性,这个对象的属性有configurable,enumerable,getset;如果是数据属性,这个对象的属性有configurable,enumerable,writablevalue.例如:

    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.edition+=newValue-2004;
          }
        }
      }
    });
    var descriptor=Object.getOwnPropertyDescriptor(book,"_year");
    alert(descriptor.value)//2004
    alert(descriptor.configurable);//false
    alert(typeof descriptor.get);//undefined
    
    var descriptor=Object.getOwnPropertyDescriptor(book,"year");
    alert(descriptor.value);//underfined
    alert(descriptor.enumerable);//false
    alert(typeof descriptor.get);//function
    • l 创建对象
    1. 工厂模式

    工厂模式是软件工程领域一个广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在javascript中的实现).

    function createPerson(name,age,job){
      var o=new Object();
      o.name=name;
      o.age=age;
      o.job=job;
      o.sayName=function(){
        alert(this.name);
      }
      return o;
    }
    var person1=createPerson("Nicholas",29,"Software Enginneer");
    var person2=createPerson("Greg",27,"Doctor");
  • 相关阅读:
    LeetCode 461. Hamming Distance
    LeetCode 442. Find All Duplicates in an Array
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode Find the Difference
    LeetCode 415. Add Strings
    LeetCode 445. Add Two Numbers II
    LeetCode 438. Find All Anagrams in a String
    LeetCode 463. Island Perimeter
    LeetCode 362. Design Hit Counter
    LeetCode 359. Logger Rate Limiter
  • 原文地址:https://www.cnblogs.com/hetaojs/p/6094655.html
Copyright © 2020-2023  润新知