整理一下js面向对象中的封装和继承。

1.封装

  js中封装有很多种实现方式,这里列出常用的几种。

1.1 原始模式生成对象

  直接将我们的成员写入对象中,用函数返回。 缺点:很难看出是一个模式出来的实例。

代码:

  1. function Stu(name, score) {
  2. return {
  3. name: name,
  4. score: score
  5. }
  6. }
  7.  
  8. var stu1 = Stu("张三", 80);
  9. var stu2 = Stu("李四", 90);
  10.  
  11. console.log(stu1.name); // 张三

1.2 生成构造模式对象

  js帮我们提供了一个使用构造函数生成对象的模式,¨所谓“构造函数”,其实就是一个普通函数,但是内部使用了this变量。当使用new关键字对构造函数生成实例后,this变量则会绑定在实例对象上。

  直接上代码:

  1. function Stu(name, score) {
  2.  
  3. this.name = name,
  4. this.score = score
  5.  
  6. }
  7.  
  8. var stu1 = new Stu("张三", 80);
  9. var stu2 = new Stu("李四", 90);
  10.  
  11. console.log(stu1.name + "/" + stu2.score); // 张三 90
  12.  
  13. console.log((stu1.constructor == Stu) + "/" + (stu2.constructor == Stu)); // true true
  14.  
  15. console.log((stu1 instanceof Stu) + "/" + (stu2 instanceof Stu)); // true true

  不难看出js的构造函数生成对象和C#用class生成对象如出一辙,都是用模板定义对象成员通过new关键字实例化。

用C#代码生成同样的Stu对象

  1. Class Stu
  2. {
  3.   public string name;
  4.   public double score;
  5. }

  

1.3 Prototype模式

  在js中,每一个构造函数都有一个prototype属性,这个对象的所有属性和方法,都会被构造函数的实例继承。

  所以实例出来的对象会包含prototype中声明的成员,每个实例出来的对象都是独立的,他们并不会相互影响。

代码:

  1. function Stu(name, score) {
  2. this.name = name,
  3. this.score = score
  4. }
  5.  
  6. Stu.prototype.type='学生';
  7. Stu.prototype.log = function (s) {
  8. console.log(s);
  9. }
  10.  
  11. var stu1 = new Stu("张三", 80);
  12. var stu2 = new Stu("李四", 90);
  13.  
  14. console.log(stu1.type + "/" + stu2.type); // 学生 学生
  15. stu1.log('hello'); // hello
  16. console.log(stu1.log == stu2.log); // true

封装就讲到这儿了,下面我们来看看js中继承又是如何实现的?

2.继承

2.1 构造函数绑定

  在子函数中直接调用 call或apply方法,将父对象的构造函数绑定在子对象上。
 
  1. function Stu(name, score) {
  2. Grade.apply(this, arguments);
  3. //Grade.call(this, arguments);
  4. this.name = name,
  5. this.score = score
  6. }
  7.  
  8. function Grade() {
  9. this.code = "初中";
  10. this.ask = function () {
  11. console.log("大家好");
  12. }
  13. }
  14.  
  15. var stu1 = new Stu("张三", 80);
  16. var stu2 = new Stu("李四", 90);
  17.  
  18. console.log(stu1.code); // 初中
  19. stu1.ask(); // 大家好

  这里的apply做了两件事情,把第一个参数this给Grade构造函数(调用者),然后再执行Grade里的代码。就相当于将Grade中用this定义的成员在Stu中再执行一遍。

  所以利用call或apply继承有一个缺点:无法继承prototype中声明的对象。

   我们可以利用prototype继承来解决这个问题。

2.2 通过prototype继承

  先看代码

代码:

  1. function Stu(name, score) {
  2.  
  3. this.name = name,
  4. this.score = score
  5. }
  6.  
  7. function Grade() {
  8. this.code = "初中";
  9. }
  10.  
  11. Stu.prototype = new Grade();
  12.  
  13. Stu.prototype.constructor = Stu; //防止继承链的紊乱,手动重置声明
  14.  
  15. var stu1 = new Stu("张三", 80);
  16. var stu2 = new Stu("李四", 90);
  17.  
  18. console.log(Stu.prototype.constructor); // 自己的构造函数
  19. console.log(stu1.code); // 初中

2.3 拷贝继承

  把父对象的所有属性和方法,拷贝进子对象,实现继承。

代码:

  1. function Stu(name, score) {
  2. this.name = name,
  3. this.score = score
  4. }
  5.  
  6. function Grade() {}
  7. Grade.prototype.code = "初中";
  8. }
  9. //函数封装
  10. function extend(C, P) {
  11. var p = P.prototype;
  12. var c = C.prototype;
  13. for (var i in p) {
  14. c[i] = p[i];
  15. }
  16. }
  17. extend(Stu, Grade);
  18. var stu1 = new Stu("张三", 80);
  19. var stu2 = new Stu("李四", 90);
  20. stu1.code='高中';
  21. console.log(stu1.code); // 高中
  22. console.log(stu2.code); // 初中
  23. console.log(Stu.prototype.constructor);
  24. console.log(Grade.prototype.constructor)

js面向对象的整理就写到这了,这个东西也不是一成不变的,使用的时候根据自己的需求做改动。  有句话说的很好,合适的才是最好的。

  1.  

javascript 面向对象整理的更多相关文章

  1. javascript面向对象精要第三章对象整理精要

    什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...

  2. JavaScript 精髓整理篇之一(对象篇)postby:http://zhutty.cnblogs.com

    废话篇头: 由于工作关系,所以写博文的时间有那么点~~,其实是输入法太懒了,都是输入法的错~~ 这一系列的博客将总结所有关于JavaScript语言的精髓,适合0基础到大师级别人物阅读. <Ja ...

  3. 闭包初体验 -《JavaScript面向对象编程指南》

    下面是我对闭包的理解:(把他们整理出来,整理的过程也是在梳理) 参考<JavaScript面向对象编程指南> 1.首先,在理解闭包之前: 我们首先应该清楚下作用域和作用域链 作用域:每个函 ...

  4. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  5. JavaScript学习总结(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  6. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  7. javascript面向对象系列第四篇——选项卡的实现

    前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡. ...

  8. javascript面向对象系列第三篇——实现继承的3种形式

    × 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...

  9. javascript面向对象系列第一篇——构造函数和原型对象

    × 目录 [1]构造函数 [2]原型对象 [3]总结 前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如 ...

随机推荐

  1. C# 虚方法的重载 new 与 virtual

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. IIS常见错误及解决

    IIS常见错误 1.HTTP 错误 404.3 - Not Found由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决办法: w ...

  3. 解决在windows的eclipse上面运行WordCount程序出现的一系列问题详解

    一.简介 要在Windows下的 Eclipse上调试Hadoop2代码,所以我们在windows下的Eclipse配置hadoop-eclipse-plugin- 2.6.0.jar插件,并在运行H ...

  4. 220 DIV2 B. Inna and Nine

    220 DIV2 B. Inna and Nine input 369727 output 2 input 123456789987654321 output 1 题意:比如例子1:369727--& ...

  5. 【Linux高频命令专题(21)】df

    概述 linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 显示指定磁盘文件的可用空间.如果没有文件名 ...

  6. 一起学Maven

    转载自:http://blog.csdn.net/songdeitao/article/details/18452459 一. 初识Maven 开场白 在现在的项目开发过程中,越来越重视项目的管理,而 ...

  7. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  8. 网站TCP链接暴增

    昨天上线后,TCP链接暴增,红点增多. 问题在查.其中有一部分,多线程修改,突破了线程数 64的限制.线程内,会发起网络请求. 怀疑是热点之一.其他的部分也有修改,也被怀疑.准备下次,2部分分开上线. ...

  9. apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]

    ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...

  10. 爬虫技术(五)-- 模拟简单浏览器(附c#代码)

    由于最近在做毕业设计,需要用到一些简单的浏览器功能,于是学习了一下,顺便写篇博客~~大牛请勿喷,菜鸟练练手~ 实现界面如下:(简单朴素版@_@||) button_go实现如下: private vo ...