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 相关文章推荐
Javascript var变量隐式声明方法
Oct 19 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
Aug 02 Javascript
防止xss和sql注入:JS特殊字符过滤正则
Apr 18 Javascript
实现51Map地图接口(示例代码)
Nov 22 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 Javascript
react学习笔记之state以及setState的使用
Dec 07 Javascript
使用vue自定义指令开发表单验证插件validate.js
May 23 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
Sep 11 Javascript
基于JS实现简单滑块拼图游戏
Oct 12 Javascript
优化Vue中date format的性能详解
Jan 13 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开发微信支付的代码分享
2014/05/25 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
Javascript面向对象编程
2012/03/18 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
python 实现登录网页的操作方法
2018/05/11 Python
解决Python对齐文本字符串问题
2019/08/28 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
前台文员的岗位职责
2013/11/14 职场文书
历史系自荐信范文
2013/12/24 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
教师批评与自我批评
2014/10/15 职场文书
赡养老人协议书范本
2015/08/06 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python