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 相关文章推荐
无语,javascript居然支持中文(unicode)编程!
Apr 12 Javascript
fix-ie5.js扩展在IE5下不能使用的几个方法
Aug 20 Javascript
jquery ajax执行后台方法
Mar 18 Javascript
JavaScript 异步方法队列链实现代码分析
Jun 05 Javascript
javascript实现检验的各种规则
Jul 31 Javascript
BootStrap 超链接变按钮的实现方法
Sep 25 Javascript
jquery 仿锚点跳转到页面指定位置的实例
Feb 14 Javascript
js常用的继承--组合式继承
Mar 06 Javascript
vue.js声明式渲染和条件与循环基础知识
Jul 31 Javascript
koa socket即时通讯的示例代码
Sep 07 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 Javascript
javascript+css实现俄罗斯方块小游戏
Jun 28 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
第十五节--Zend引擎的发展
2006/11/16 PHP
php中随机显示图片的函数代码
2011/06/23 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
jQuery1.6 使用方法一
2011/11/23 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
原生js检测页面加载完毕的实例
2018/09/11 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
python中使用enumerate函数遍历元素实例
2014/06/16 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
发布你的Python模块详解
2016/09/15 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
使用python+whoosh实现全文检索
2019/12/09 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
2014年学校教学工作总结
2014/12/06 职场文书
医院科室评语
2015/01/04 职场文书
建党伟业的观后感
2015/06/01 职场文书
雷锋之歌观后感
2015/06/10 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
使用refresh_token实现无感刷新页面
2022/04/26 Javascript