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 相关文章推荐
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
Jan 13 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
May 13 Javascript
JavaScript中boolean类型之三种情景实例代码
Nov 21 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
JavaScript实现弹窗效果代码分析
Mar 09 Javascript
ES6 javascript中Class类继承用法实例详解
Oct 30 Javascript
微信小程序登录换取token的教程
May 31 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
Apr 11 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
Aug 23 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
解决vue刷新页面以后丢失store的数据问题
Aug 11 Javascript
JS+CSS实现过渡特效
Jan 02 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
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
浅谈php的优缺点
2015/07/14 PHP
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
PHP _construct()函数讲解
2019/02/03 PHP
怎么清空javascript数组
2013/05/11 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
python+django+rest框架配置创建方法
2019/08/31 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
大学生个人自荐信样本
2014/03/02 职场文书
文艺演出策划方案
2014/06/07 职场文书
大专学生求职自荐信
2014/07/06 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
单位接收函格式
2015/01/30 职场文书
音乐教师求职信范文
2015/03/20 职场文书
民事起诉状范文
2015/05/19 职场文书
预备党员表决心的话
2015/09/22 职场文书