zoukankan      html  css  js  c++  java
  • javascript-代码复用模式

    代码复用模式

    1)使用原型继承
               函数对象中自身声明的方法和属性与prototype声名的对象有什么不同:
         自身声明的方法和属性是静态的, 也就是说你在声明后,试图再去增加新的方法或者修改已有的方法,
         并不会由其创建的对象产生影响,也即继承失败。
         而prototype可以动态地增加新的方法或者修改已有的方法, 从而是动态的,一旦父函数对象声明了相关的prototype属性,由其创建的对象会自动继承这些prototype的属性。
     
          既然有函数对象本身的属性, 也有prototype的属性, 那么是由其创建的对象是如何搜索相应的属性的呢?
          基本是按照下面的流程和顺序来进行:
         1 先去搜索函数对象本身的属性,如果找到立即执行
         2 如果1没有找到,则会去搜索prototype属性,有2种结果,找到则直接执行,否则继续搜索父对象的父对象的prototype,
         直至找到,或者到达prototype chain 的结尾(结尾会是Object对象)
         上面也回答如果函数对象本身的属性与prototype属性相同(重名)时的解决方式, 函数本身的对象优先。
        实例:
    Js代码  收藏代码
    1.    
    2. function Employee(name)  
    3.  {  
    4.   this.name = "";  
    5.   this.dept = "general";  
    6.   this.gender = "unknown";  
    7.  }  
    8.  function WorkerBee()  
    9.  {  
    10.    this.projects = [];  
    11.    this.hasCar = false;  
    12.  }  
    13.  WorkerBee.prototype = new Employee; // 第一层prototype链  
    14.  function Engineer()  
    15.  {  
    16.    this.dept = "engineer"; //覆盖了 "父对象"  
    17.    this.language = "javascript";  
    18.  }  
    19.  Engineer.prototype = new WorkerBee; // 第二层prototype链  
    20.  var jay = new Engineer("Jay");  
    21.  if (flag)  
    22.  {  
    23.     alert(jay.dept); //engineer, 找到的是自己的属性  
    24.     alert(jay.hasCar); // false, 搜索到的是自己上一层的属性  
    25.     alert(jay.gender); // unknown, 搜索到的是自己上二层的属性  
    26.  }  
     
    2)使用Object.create继承对象
      ECMAScript5也提供了类似的一个方法叫做Object.create用于继承对象。
          实例:  
    Js代码  收藏代码
    1. var parent = {  
    2.   name : "张三"  
    3. };  
    4.   
    5.  /* 使用新版的ECMAScript 5提供的功能 */  
    6.  var child = Object.create(parent, {  
    7.    age : {  
    8.     value : 2  
    9.    },  
    10.    sex : {  
    11.     value : '男'  
    12.    }  
    13.  });  
    14.  console.log("child.age.value: " + child.age + "-----sex: " + child.sex);  
    15.  //child.age.value: 2-----sex: 男  
     
     
    3)使用Object.defineProperty(可以更细粒度的对新增的属性进行配置设置)
          语法:
          Object.defineProperty(obj, prop, descriptor)
          参数:
         obj:目标对象
         prop:需要定义的属性或方法的名字。
         descriptor:目标属性所拥有的特性。
         可供定义的特性列表:
         value:属性的值
         writable:如果为false,属性的值就不能被重写。
         get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。
         set:一旦目标属性被赋值,就会调回此方法。
         configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable,   configurable, enumerable)的行为将被无效化。
         enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
         实例:  
    Js代码  收藏代码
    1. var foo = {x:10};  
    2. Object.defineProperty(foo, "y", {  
    3.     value:20,  
    4.     writable: false,//只读  
    5.      configurable: false, //不可配置  
    6.     enumerable: true  
    7. });  
    8. console.log(foo.y); //20  
     
     4)通过call或apply方法
          方法定义   
         call方法:
         语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
         定义:调用一个对象的一个方法,以另一个对象替换当前对象。
         说明:
         call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
         如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
     
         apply方法:
         语法:apply([thisObj[,argArray]])
         定义:应用某一对象的一个方法,用另一个对象替换当前对象。
         说明:
         如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
         如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
     
        说明:call, apply,这两个方法基本上是一个意思,区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments
         实例: 
    Js代码  收藏代码
    1.  function Animal(name){  
    2.     this.name = name;  
    3.     this.showName = function(){  
    4.        alert(this.name);  
    5.     }  
    6. }  
    7.     
    8.  function Cat(name){  
    9.      Animal.call(this, name);  
    10.  }  
    11.     
    12.  var cat = new Cat("Black Cat");  
    13.  cat.showName(); //Black Cat  
    14.  //Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了  
    15. //此时Cat对象就能够直接调用Animal的方法以及属性了.  
     
  • 相关阅读:
    js创建json对象
    redis命令行清缓存
    查询某个用户所有新增的用户,本月新增用户,上个月新增的用户
    js处理el表达式
    调用上一个页面的js方法
    生成唯一code
    jeeplus中两个项目redis冲突问题
    $ 与 #
    字典表的维护
    将html文档转成pdf
  • 原文地址:https://www.cnblogs.com/wudan7/p/4175450.html
Copyright © 2011-2022 走看看