javascript 面向对象封装与继承


Posted in Javascript onNovember 27, 2014

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

1.封装

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

1.1 原始模式生成对象

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

代码:

       function Stu(name, score) {

            return {

                name: name,

                score: score

            }

        }

        var stu1 = Stu("张三", 80);

        var stu2 = Stu("李四", 90);

        console.log(stu1.name); // 张三

1.2 生成构造模式对象

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

直接上代码:

      function Stu(name, score) {

            this.name = name,

            this.score = score

        }

        var stu1 = new Stu("张三", 80);

        var stu2 = new Stu("李四", 90);

        console.log(stu1.name + "/" + stu2.score); // 张三  90

        console.log((stu1.constructor == Stu) + "/" + (stu2.constructor == Stu)); // true  true

        console.log((stu1 instanceof Stu) + "/" + (stu2 instanceof Stu)); // true  true

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

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

Class Stu

{
public string name;

public double score;                    

}

ok,到这儿基本的对象有了。 那么现在我们需要一个所有对象都公用的方法,而且只让这个方法创建一次。(不随着对象new而重复创建)

怎么办呢? 大家都知道在C#中我们可以用静态成员。那么在js中怎么做呢?

1.3 Prototype模式

在js中,每一个构造函数都有一个prototype属性,这个对象的所有属性和方法,都会被构造函数的实例继承。那么我们直接给prototype添加成员就相当于在C#中声明静态成员了。

代码:

      function Stu(name, score) {

            this.name = name,

            this.score = score

        }

        Stu.prototype.type='学生';

        Stu.prototype.log = function (s) {

            console.log(s);

        }

        var stu1 = new Stu("张三", 80);

        var stu2 = new Stu("李四", 90);

        console.log(stu1.type + "/" + stu2.type); // 学生 学生

        stu1.log('hello');  // hello

        console.log(stu1.log == stu2.log);  // true

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

2.继承

2.1 构造函数绑定

在子函数中直接调用 call或apply方法,将父对象的构造函数绑定在子对象上。
 

   function Stu(name, score) {

            Grade.apply(this, arguments);

            //Grade.call(this, arguments);

            this.name = name,

            this.score = score

        }

        function Grade() {

            this.code = "初中";

            this.ask = function () {

                console.log("大家好");

            }

        }

        var stu1 = new Stu("张三", 80);

        var stu2 = new Stu("李四", 90);

        console.log(stu1.code); // 初中

        stu1.ask(); // 大家好

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

2.2 通过prototype继承

先看代码

代码:

    function Stu(name, score) {

            this.name = name,

            this.score = score

        }

        function Grade() {

            this.code = "初中";

        }

        Stu.prototype = new Grade();

        Stu.prototype.constructor = Stu; //防止继承链的紊乱,手动重置声明

        var stu1 = new Stu("张三", 80);

        var stu2 = new Stu("李四", 90);

        console.log(Stu.prototype.constructor); // 自己的构造函数

        console.log(stu1.code); // 初中

前面说过prototype就相当于C#中的静态成员,所以我们就把父类的所有成员都变成自己的静态成员来实现继承。

通过prototype继承有一个缺点:所有继承的成员都是静态的,那么怎么继承对象成员呢?

2.3 拷贝继承

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

代码:

    function Stu(name, score) {

            this.name = name,

            this.score = score

        }

        function Grade() {}

        Grade.prototype.code = "初中";

    }

        //函数封装

        function extend(C, P) {

            var p = P.prototype;

            var c = C.prototype;

            for (var i in p) {

                c[i] = p[i];

            }

        }

        extend(Stu, Grade);

        var stu1 = new Stu("张三", 80);

        var stu2 = new Stu("李四", 90);

        stu1.code='高中';

        console.log(stu1.code); // 高中

        console.log(stu2.code); // 初中

        console.log(Stu.prototype.constructor);

        console.log(Grade.prototype.constructor)

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

这里只针对封装和继承进行了分析,后续我们再做一些其他方面的文章,让小伙伴们更加深入的了解javascript面向对象编程。当然都是个人的一些理解,如有遗漏,请联系我。

Javascript 相关文章推荐
jQuery实现html元素拖拽
Jul 21 Javascript
简单谈谈javascript中的变量、作用域和内存问题
Aug 30 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
原生js封装二级城市下拉列表的实现代码
Jun 16 Javascript
微信小程序 Tab页切换更新数据
Jan 05 Javascript
Bootstrap进度条学习使用
Feb 09 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
May 01 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
你可能不知道的前端算法之文字避让(inMap)
Jan 12 Javascript
详解vue-cli下ESlint 配置说明
Sep 03 Javascript
vuecli项目构建SSR服务端渲染的实现
Oct 30 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
Nov 12 Javascript
javascript制作坦克大战全纪录(2)
Nov 27 #Javascript
javascript制作坦克大战全纪录(1)
Nov 27 #Javascript
使用jsonp完美解决跨域问题
Nov 27 #Javascript
JavaScript变量声明详解
Nov 27 #Javascript
js脚本实现数据去重
Nov 27 #Javascript
实例分析js和C#中使用正则表达式匹配a标签
Nov 26 #Javascript
javascript几个易错点记录
Nov 26 #Javascript
You might like
php函数指定默认值方法的小例子
2013/12/04 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
python魔法方法-属性访问控制详解
2016/07/25 Python
Python callable()函数用法实例分析
2018/03/17 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
实现向右循环移位
2014/07/31 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
计算机应用毕业生自荐信
2013/10/23 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
三严三实学习心得体会
2014/10/13 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python