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实现跨域的4种实用方法原理分析
Oct 29 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
May 11 Javascript
Actionscript与javascript交互实例程序(修改)
Sep 22 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
Apr 07 Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 Javascript
bootstrap轮播图示例代码分享
May 17 Javascript
requirejs按需加载angularjs文件实例
Jun 08 Javascript
jQuery 控制文本框自动缩小字体填充
Jun 16 jQuery
微信小程序关键字变色实现代码实例
Dec 13 Javascript
Vue组件模板的几种书写形式(3种)
Feb 19 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 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
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
php获取数组中重复数据的两种方法
2013/06/28 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
开启PHP的伪静态模式
2015/12/31 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
Python如何访问字符串中的值
2020/02/09 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Python如何输出百分比
2020/07/31 Python
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
学校政风行风评议工作总结
2014/10/21 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
2015年质检工作总结
2015/05/04 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
go语言map与string的相互转换的实现
2021/04/07 Golang
教你怎么用python实现字符串转日期
2021/05/24 Python