`
qiansheng1987
  • 浏览: 5683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript-代码复用模式

阅读更多

代码复用模式

1)使用原型继承
           函数对象中自身声明的方法和属性与prototype声名的对象有什么不同:
     自身声明的方法和属性是静态的, 也就是说你在声明后,试图再去增加新的方法或者修改已有的方法,
     并不会由其创建的对象产生影响,也即继承失败。
     而prototype可以动态地增加新的方法或者修改已有的方法, 从而是动态的,一旦父函数对象声明了相关的prototype属性,由其创建的对象会自动继承这些prototype的属性。
 
      既然有函数对象本身的属性, 也有prototype的属性, 那么是由其创建的对象是如何搜索相应的属性的呢?
      基本是按照下面的流程和顺序来进行:
     1 先去搜索函数对象本身的属性,如果找到立即执行
     2 如果1没有找到,则会去搜索prototype属性,有2种结果,找到则直接执行,否则继续搜索父对象的父对象的prototype,
     直至找到,或者到达prototype chain 的结尾(结尾会是Object对象)
     上面也回答如果函数对象本身的属性与prototype属性相同(重名)时的解决方式, 函数本身的对象优先。
    实例:
 
function Employee(name)
 {
  this.name = "";
  this.dept = "general";
  this.gender = "unknown";
 }
 function WorkerBee()
 {
   this.projects = [];
   this.hasCar = false;
 }
 WorkerBee.prototype = new Employee; // 第一层prototype链
 function Engineer()
 {
   this.dept = "engineer"; //覆盖了 "父对象"
   this.language = "javascript";
 }
 Engineer.prototype = new WorkerBee; // 第二层prototype链
 var jay = new Engineer("Jay");
 if (flag)
 {
    alert(jay.dept); //engineer, 找到的是自己的属性
    alert(jay.hasCar); // false, 搜索到的是自己上一层的属性
    alert(jay.gender); // unknown, 搜索到的是自己上二层的属性
 }
 
2)使用Object.create继承对象
  ECMAScript5也提供了类似的一个方法叫做Object.create用于继承对象。
      实例:  
 var parent = {
   name : "张三"
 };

  /* 使用新版的ECMAScript 5提供的功能 */
  var child = Object.create(parent, {
    age : {
     value : 2
    },
    sex : {
     value : '男'
    }
  });
  console.log("child.age.value: " + child.age + "-----sex: " + child.sex);
  //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中列举出来。
     实例:  
 var foo = {x:10};
 Object.defineProperty(foo, "y", {
     value:20,
     writable: false,//只读
      configurable: false, //不可配置
     enumerable: true
 });
 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
     实例: 
  function Animal(name){
     this.name = name;
     this.showName = function(){
        alert(this.name);
     }
 }
   
  function Cat(name){
      Animal.call(this, name);
  }
   
  var cat = new Cat("Black Cat");
  cat.showName(); //Black Cat
  //Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了
 //此时Cat对象就能够直接调用Animal的方法以及属性了.
 
分享到:
评论

相关推荐

    简单谈谈javascript代码复用模式

    在探讨JavaScript代码复用模式时,首先需要了解代码复用的原则,以及JavaScript中对象的创建和继承机制。在软件工程中,代码复用是一种提高开发效率、降低软件维护成本的有效方式。GoF(设计模式的四位作者,即Erich...

    深入理解JavaScript系列(45):代码复用模式(避免篇)详解

    否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量避免使用这些模式,因为或多或少...

    JavaScript----创建可重用代码

    最后,设计模式也是实现代码复用的重要工具。比如单例模式确保一个类只有一个实例,工厂模式用于创建对象而不暴露实例化过程,装饰者模式用于动态地给对象添加新的行为等。这些设计模式在JavaScript中同样适用,并能...

    JavaScript代码复用模式详解

    JavaScript代码复用是提高效率和减少冗余的关键实践。它主要依赖于对象组合和原型继承等机制。在JavaScript中,由于没有传统的类概念,而是基于原型的面向对象模型,因此,代码复用的方式与C++或Java等使用类的语言...

    JavaScript 设计模式(高清扫描版本)- 张容铭

    JavaScript设计模式是由张容铭编著的一本关于JavaScript编程领域的重要参考书籍,主要探讨了如何在JavaScript编程中应用设计模式...通过阅读和实践书中的内容,你将能够写出更加优雅、高效和易于维护的JavaScript代码。

    JavaScript代码复用模式实例分析

    JavaScript代码复用是提高开发效率和维护软件质量的重要手段,在日常的前端开发中,开发者经常需要利用已有的代码段来实现新的功能,而不是每次都从头开始编写。代码复用能够减少重复代码的编写,降低出错的几率,...

    build-a-javascript-framework.pdf

    通过构造函数、`prototype`属性和`__proto__`链,读者将学会如何设计和实现面向对象的JavaScript代码。 总的来说,《构建JavaScript框架》这本书不仅提供了理论知识,还包含了丰富的实战指导,是学习和进阶...

    Python-flaskbox可复用工厂模式框架

    - **代码复用**: 通过工厂模式,可以创建多个Flask应用实例,每个实例具有不同的配置和功能,但共享相同的代码基础。 5. **部署和测试**: 在实际项目中,使用flaskbox可能涉及到设置虚拟环境、安装依赖、配置环境...

    Javascript - The Web Warrior Series 6th Edition

    - 函数是可复用的代码块,可以接受参数并返回值。 - JavaScript中的函数也是对象,这意味着它们可以被赋值给变量、存储在对象中或作为参数传递给其他函数。 2. **进阶篇**: - **对象**: - 对象是属性和方法的...

    JavaScript源代码集

    6. **JavaScript设计模式**:工厂模式、单例模式、观察者模式等,提升代码可维护性和复用性。 7. **错误处理**:try...catch语句,以及如何优雅地处理运行时错误。 8. **性能优化**:避免内存泄漏,使用事件委托,...

    代码复用避免篇1

    本文将探讨四种常见的代码复用模式,并分析它们的优缺点。 首先,我们来看“默认模式”的代码复用,即通过父类构造函数创建子类的原型。这种方式看似简单,但存在缺陷。例如,在以下示例中,`Child`无法接受构造...

    设计模式java源码-JavaScript-Design-Patterns:JavaScript设计模式Udacity课程的源代码

    这个压缩包“设计模式java源码 - JavaScript-Design-Patterns”包含了用于讲解JavaScript设计模式的Udacity在线课程的源代码。这个课程的目标是帮助开发者理解和应用各种设计模式,提升他们的编程技能和代码质量。 ...

    JavaScript-javaweb项目

    7. **JavaScript 模块化**:CommonJS(Node.js 使用)和 ES6 模块系统,用于组织和管理代码,提高代码复用性和可维护性。 转向 JavaWeb 领域,我们关注以下几个关键概念: 1. **Servlet**:JavaServer Pages(JSP...

    JavaScript模式中文[pdf] 百度云

     第6章 代码复用模式  传统与现代继承模式的比较  使用类式继承时的预期结果  类式继承模式#1——默认模式  类式继承模式#2——借用构造函数  类式继承模式#3——借用和设置原型  类式继承模式#4——共享原型...

    javascript-patterns:一组有用的 JavaScript 模式

    - 复用模式(原型模式):利用原型链实现对象间的属性继承。 2. **结构型模式**: - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 组合模式:将对象组合成树形结构,表示部分-整体的关系。 - ...

    JavaScript-Design-Patterns:一系列练习练习可增进对JavaScript设计模式的理解

    这些模式在实际开发中起着关键作用,提高了代码的可读性、可维护性和复用性。 1. **创建型模式**: - 单例模式:确保一个类只有一个实例,并提供全局访问点。 - 工厂模式:提供创建对象的接口,但隐藏了具体创建...

Global site tag (gtag.js) - Google Analytics