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 相关文章推荐
ImageZoom 图片放大镜效果(多功能扩展篇)
Apr 14 Javascript
js如何获取file控件的完整路径具体实现代码
May 15 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
Jan 06 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
原生js和jQuery随意改变div属性style的名称和值
Oct 22 Javascript
javascript中in运算符用法分析
Apr 28 Javascript
Bootstrap选项卡与Masonry插件的完美结合
Jul 06 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 Javascript
使用JavaScript通过前端发送电子邮件
May 22 Javascript
Vue项目开发常见问题和解决方案总结
Sep 11 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
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
js 获取radio按钮值的实例
2013/08/17 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
ES6解构赋值实例详解
2017/10/31 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python对html代码进行escape编码的方法
2015/05/04 Python
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
python自定义异常实例详解
2017/07/11 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
详解Anaconda 的安装教程
2020/09/23 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
高一英语教学反思
2014/01/22 职场文书
实习生岗位职责
2014/04/12 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
工伤私了协议书范本
2014/11/24 职场文书
租车协议书
2015/01/27 职场文书
居住证明范文
2015/06/17 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
Python学习之os包使用教程详解
2022/03/21 Python