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 三种不同位置代码的写法
Oct 25 Javascript
取得窗口大小 兼容所有浏览器的js代码
Aug 09 Javascript
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
Nov 03 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
原生js实现日期联动
Jan 12 Javascript
jquery插件bxslider用法实例分析
Apr 16 Javascript
微信小程序 图片边框解决方法
Jan 16 Javascript
H5上传本地图片并预览功能
May 08 Javascript
Vue AST源码解析第一篇
Jul 19 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
Dec 08 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
Aug 16 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 strnatcmp()函数的用法总结
2013/11/27 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
VUE重点问题总结
2018/03/19 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
Python break语句详解
2014/03/11 Python
python线程、进程和协程详解
2016/07/19 Python
详解python3实现的web端json通信协议
2016/12/29 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
python 实现生成均匀分布的点
2019/12/05 Python
Python列表list操作相关知识小结
2020/01/29 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
html5与css3小应用
2013/04/03 HTML / CSS
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
一级电子管军用接收机测评
2022/04/05 无线电