JavaScript模拟实现封装的三种方式及写法区别


Posted in Javascript onOctober 27, 2017

前  言

   继承是使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承!  JS中有很多实现继承的方法,今天我给大家介绍其中的三种吧。

1.在 Object类上增加一个扩展方法

//声明一个父类
function Person(name){
 this.name=name;
 this.age=age;
 this.say=function(){
   alert("我叫"+this.name);
 }
}
//声明一个子类 
function Student(){
 this.no=no;
 this.study=function(){
  alert("我在学习!");
 }
}
// 通过循坏,将父类对象的所有属性和方法,全部赋给子类对象
Object.prototype.extend=function(parent){
 for(var i in parent){
   this[i].parent[i];
 }
}
var p=new Person("张三",12);
var s=new Student("1234567");
//子类对象调用这个扩展方法
s.extend()
console.log(s);

上述实现继承的原理:

通过循坏,将父类对象的所有属性和方法,全部赋给子类对象。关键点在于for-in循坏,即使不扩展Object,也能通过简单的循坏实现操作。

但是用这种方法实现继承也有一些缺点:

①无法通过一次实例化,直接拿到完整的子类对象。而需要先拿到父类对象和子类对象两个对象,再手动合并;

②扩展Object的继承方法,也会保留在子类的对象上。

再来看看第二种实现继承的方法吧~

2.使用原型继承

在介绍这种方法之前先来说两个概念:原型对象与原型

1、prototype:函数的原型对象

①只有函数才有prototype,而且所有函数必有prototype

②prototype本身也是一个对象!

③prototype指向了当前函数所在的引用地址!

2、__proto__:对象的原型!

①只有对象才有__proto__,而且所有对象必有__proto__

②__proto__也是一个对象,所以也有自己的__proto__,顺着这条线向上照的顺序,就是原型链。

③函数、数组都是对象,都有自己的__proto__

//声明父类
function Person(name,age){
   this.name=name;
   this.age=age;
   this.say=function(){
    alert("我叫"+this.name);
   }
}
//声明子类   
function Student(no){
   this.no=no;
   this.study=function(){
    alert("我在学习!我叫"+this.name+"今年"+this.age");
   }
}
//将父类对象赋给子类的prototype  
Student.prototype=new Person("张三",14);
//拿到子类对象时,就会将父类对象的所有属性和方法,添加到__proto__
var s=new Student(); 
s.study();

使用原型继承的原理:

将父类对象,赋值给子类的prototype,那么父类对象的属性和方法就会出现在子类的prototype中。那么,实例化子类时,子类的prototype又会到子类对象的__proto__中,最终,父类对象的属性和方法,会出现在子类对象的__proto__中。

这种继承的特点:

①子类自身的所有属性都是成员属性,父类继承过来的属性都是原型属性。

②依然无法通过一步实例化拿到完成的子类对象。

第三种实现继承的方法:

call()和apply()还有bind(),这三种方法很相似,只有在传参方面有所不同。

function Person(name,age){
  this.name=name;
  this.age=age;
  this.say=function(){
    alert("我叫"+this.name);
    }
}
function Student(no,name,age){
  this.no=no;
  this.study=function(){
    alert("我在学习!");
  }
//将父类函数的this,指向为子类函数的this
Person.call(this,name,age);
}
var s=new Student(12,"张三",24);
console.log(s);

三个函数的唯一区别,在于接受func的参数列表的方式不同,除此之外,功能上没有任何差异!

三个函数的写法(区别):

call写法:func.call(func的this指向的obj,func参数1,func参数2,...);

apply写法:func.apply(func的this指向的obj,[func参数1,func参数2,...]);

bind写法:func.bind(func的this指向的obj)(func参数1,func参数2,...);

总结

以上所述是小编给大家介绍的JavaScript模拟实现封装的三种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Array对象方法参考
Oct 03 Javascript
JS 退出系统并跳转到登录界面的实现代码
Jun 29 Javascript
JQuery加载图片自适应固定大小的DIV
Sep 12 Javascript
js控制页面的全屏展示和退出全屏显示的方法
Mar 10 Javascript
javascript自定义右键弹出菜单实现方法
May 25 Javascript
javascript日期处理函数,性能优化批处理
Sep 06 Javascript
浅析JS操作DOM的一些常用方法
May 13 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
Node 自动化部署的方法
Oct 17 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
js实现坦克大战游戏
Feb 24 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
Oct 27 #Javascript
javascript浏览器用户代理检测脚本实现方法
Oct 27 #Javascript
vue中的event bus非父子组件通信解析
Oct 27 #Javascript
基于javascript中的typeof和类型判断(详解)
Oct 27 #Javascript
webpack配置之后端渲染详解
Oct 26 #Javascript
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 #jQuery
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
Oct 26 #Javascript
You might like
MySQL数据源表结构图示
2008/06/05 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
PHP进程同步代码实例
2015/02/12 PHP
jquery获取元素索引值index()示例
2014/02/13 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
深入理解python中sort()与sorted()的区别
2018/08/29 Python
python DataFrame 取差集实例
2019/01/30 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
聚美优品励志广告词
2014/03/14 职场文书
演讲主持词
2014/03/18 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
安全检查汇报材料
2014/12/26 职场文书
银行招聘自荐信
2015/03/06 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python