zoukankan      html  css  js  c++  java
  • 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");
  • 相关阅读:
    goland 安装包激活码
    go目录文件
    php 单表数据转化为json格式
    thinkphp分页查询,后台处理怎么做
    用js 获取url 参数 页面跳转 ? 后的参数
    约瑟夫问题
    openstack配置
    Python数据结构
    Python常用排序算法
    scrapy使用
  • 原文地址:https://www.cnblogs.com/hetaojs/p/6094655.html
Copyright © 2011-2022 走看看