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 相关文章推荐
js arguments对象应用介绍
Nov 28 Javascript
如何使Chrome控制台支持多行js模式——意外发现
Jun 13 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
Jun 14 Javascript
解析Javascript中难以理解的11个问题
Dec 09 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
JavaScript forEach()遍历函数使用及介绍
Jul 08 Javascript
angularjs http与后台交互的实现示例
Dec 21 Javascript
基于JS实现前端压缩上传图片的实例代码
May 14 Javascript
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 Javascript
JS原形与原型链深入详解
May 09 Javascript
解决vue一个页面中复用同一个echarts组件的问题
Jul 19 Javascript
js定时器出现第一次延迟的原因及解决方法
Jan 04 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
jQuery实现长文字部分显示代码
2013/05/13 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
详解jQuery选择器
2016/12/21 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Python异常处理操作实例详解
2018/08/28 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Python是如何进行类型转换的
2013/06/09 面试题
幼儿园新学期寄语
2014/01/18 职场文书
高中生物教学反思
2014/02/05 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
会计工作决心书
2014/03/11 职场文书
设计大赛策划方案
2014/06/13 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
《假如》教学反思
2016/02/17 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
Python进度条的使用
2021/05/17 Python
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android