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 相关文章推荐
IE关闭时判断及AJAX注销案例学习
Feb 18 Javascript
JQuery给元素添加/删除节点比如select
Apr 02 Javascript
jquery对dom的操作常用方法整理
Jun 25 Javascript
图片Slider 带左右按钮的js示例
Aug 30 Javascript
js取值中form.all和不加all的区别介绍
Jan 20 Javascript
javascript实现随时变化着的背景颜色
Apr 02 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
Oct 26 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
Oct 08 Javascript
react-router实现跳转传值的方法示例
May 27 Javascript
Js代码中的span拼接问题解决
Nov 22 Javascript
Vue实现开关按钮拖拽效果
Sep 22 Javascript
关于vue中如何监听数组变化
Apr 28 Vue.js
使用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
php miniBB中文乱码问题解决方法
2008/11/25 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
js中复制行和删除行的操作实例
2013/06/25 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
解析Python的缩进规则的使用
2019/01/16 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python手写均值滤波
2020/02/19 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
秘书英文求职信范文
2014/01/31 职场文书
博士生导师推荐信
2014/07/08 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
英语通知范文
2015/04/22 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书