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常用对话框小集
Sep 13 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
Oct 22 Javascript
js函数在frame中的相互调用详解
Mar 03 Javascript
jQuery的remove()方法使用详解
Aug 11 Javascript
javascript每日必学之封装
Feb 23 Javascript
微信小程序 天气预报开发实例代码源码
Jan 20 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
Sep 20 Javascript
Mac中安装nvm的教程分享
Dec 11 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
webpack4 SplitChunks实现代码分隔详解
May 23 Javascript
js实现GIF动图分解成多帧图片上传
Oct 24 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 24 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目录函数实现创建、读取目录教程实例
2011/01/13 PHP
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
jQuery实现日历效果
2020/09/11 jQuery
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
python的range和linspace使用详解
2019/11/27 Python
Python3列表List入门知识附实例
2020/02/09 Python
python Selenium 库的使用技巧
2020/10/16 Python
python unichr函数知识点总结
2020/12/16 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
strstr()的简单实现
2013/09/26 面试题
名人演讲稿范文
2013/12/28 职场文书
促销活动总结范文
2014/04/30 职场文书
学雷锋标语
2014/06/25 职场文书
首都博物馆观后感
2015/06/05 职场文书
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技