JavaScript继承模式粗探


Posted in Javascript onJanuary 12, 2016

真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承。Javascript原型继承是一个被说烂掉了的话题,但是自己对于这个问题一直没有彻底理解,今天花了点时间又看了一遍《Javascript模式》中关于原型实现继承的几种方法,下面来谈谈JS中比较简单的继承方法,如果大家有不同意见,欢迎建议。

最基础的原型链继承在这里就不复述了,主要讲一下其他的继承模式。

1.借用构造函数继承

function Father (name) {
this.name=name;
}
function Son (name) {
Father.call(this,name); //在子类型中调用超类型的构造函数
this.age=15;
}
var me=new Son("Su");

好处:可以为子类型传递参数,如图中的name属性。

坏处:1.方法在构造函数中定义,无法复用。2.超类型原型中定义的方法对子类型是不可见的。

2.组合继承(综合原型链与构造函数)

//超类型构造函数function Father (name) {
this.name=name;
this.famMember=[];
}//超类型构造函数原型方法
Father.prototype.sayName=function () {
alert(this.name);
}//子类型构造函数
function Son (name,age) {
Father.call(this,name); //构造函数方法
this.age=age;
}
Son.prototype=new Father(); //重写子类型原型对象
Son.prototype.constructor=Son; //重写构造函数属性指向子类型
Son.prototype.sayAge=function () {
alert(this.age);
} //重写原型对象后再加入方法
var me=new Son("Su",15);
me.famMember.push("dad","mom"); //子类型可以调用超类型构造函数内的方法var he=new Son("Li",14);alert(he.famMember); // []

好处:不同的子类既可以拥有自己的属性,也可以使用相同的方法。

坏处:这种方法需要调用2次超类型的构造函数,同名的属性方法会被覆盖一次。

3.原型式继承 (类似Object.create())

function object (o) {
function F () {}
F.prototype=o;
return new F();
}var obj={}; //将obj对象传入作为新对象的原型。var me=object(obj);

使用这种方法继承需要有一个对象作为原型对象,所以所有继承其的子类型的属性方法都是共用的。

ES5通过新增Object.creatr()方法规范了原型式继承。

4.寄生式继承 (可以设置私有方法的原型式继承)

function object (o) {
function F () {}
F.prototype=o;
return new F();
}
var obj={}; //将obj对象传入作为新对象的原型。到这里都与原型式继承相同function creObj(o) {var clone=object(obj);
clone.sayHi=function () {

alert("Hi");
};return clone; }
var me=creObj(obj);

好处:这种方式弥补了原型式继承只有公有属性方法的缺陷,使子类型能有私有属性方法。

5.寄生组合式继承

function inherit (father,son) {
var pro=Object(father.prototype); //创建超类型原型对象的副本
pro.constructor=son;
son.prototype=pro;



 //将副本作为子类型的原型对象
}

本方法用于弥补组合继承中属性方法覆盖的问题。

用上图代码代替组合继承中 Son.prototype=new Father(); 这段代码。这样只需调用一次父类型的构造函数,避免了创造多余不必要的属性方法,并且保持了原型链不改变,是一种理想的引用类型继承方法。

关于js继承模式先粗略给大家介绍这么多,相信对大家有所帮助,更多信息请继续关注三水点靠木网站。

Javascript 相关文章推荐
巧妙破除网页右键禁用的十大绝招
Aug 12 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
Apr 05 Javascript
文本框input聚焦失焦样式实现代码
Oct 12 Javascript
把input初始值不写value的具体实现方法
Jul 04 Javascript
JS模拟按钮点击功能的方法
Dec 22 Javascript
基于Bootstrap重置输入框内容按钮插件
May 12 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
May 24 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
详解Node.js利用node-git-server快速搭建git服务器
Sep 27 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
vue 取出v-for循环中的index值实例
Nov 09 Javascript
Vue页面跳转传递参数及接收方式
Sep 09 Javascript
轻松实现Bootstrap图片轮播
Apr 20 #Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
Jan 12 #Javascript
学习JavaScript设计模式之策略模式
Jan 12 #Javascript
基于jQuery1.9版本如何判断浏览器版本类型
Jan 12 #Javascript
jQuery版本升级踩坑大全
Jan 12 #Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 #Javascript
7个jQuery最佳实践
Jan 12 #Javascript
You might like
php实现utf-8转unicode函数分享
2015/01/06 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
Python字典,函数,全局变量代码解析
2017/12/18 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
python 错误处理 assert详解
2020/04/20 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
出国留学自荐信
2013/10/25 职场文书
求职信格式范本
2013/11/15 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
学习决心书
2014/03/11 职场文书
《观舞记》教学反思
2014/04/16 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
2014年妇女工作总结
2014/12/06 职场文书
酒店前台辞职书
2015/02/26 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
react 项目中引入图片的几种方式
2021/06/02 Javascript
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
Python实现信息管理系统
2022/06/05 Python