JavaScript继承模式粗探

作者:卡卡颂 时间:2024-04-23 09:25:20 

真正意义上来说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继承模式先粗略给大家介绍这么多,相信对大家有所帮助,更多信息请继续关注脚本之家网站。

标签:js,继承,模式
0
投稿

猜你喜欢

  • 解决SecureCRT通过SSH连接Ubuntu时vi命令有多余的m的问题

    2023-11-19 19:32:24
  • Python实现生成随机日期字符串的方法示例

    2023-10-27 11:51:37
  • 解决Django后台ManyToManyField显示成Object的问题

    2021-01-06 09:58:21
  • mysql根据json字段内容作为查询条件(包括json数组)检索数据

    2024-01-13 00:50:50
  • Python利用Turtle库绘制一个小老虎

    2023-06-13 11:35:02
  • 用 Schema 约束 XML 数据

    2010-08-24 18:21:00
  • Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法

    2021-08-12 00:40:33
  • python编译pyc文件的过程解析

    2022-08-13 20:48:19
  • 一文带你掌握Python中多线程和线程池的使用方法

    2022-10-20 21:53:09
  • 玩客云折腾记录之编译 ArmBian 系统

    2022-03-07 15:28:52
  • Python操作Oracle数据库的简单方法和封装类实例

    2024-01-15 09:34:32
  • 用Dreamweaver设计实现网页过渡转换功能

    2008-09-04 10:09:00
  • 非常全面的实用JavaScript开发工具列表

    2010-01-05 16:44:00
  • Python生成rsa密钥对操作示例

    2021-08-25 03:43:31
  • python生成随机数、随机字符、随机字符串的方法示例

    2021-06-04 06:46:39
  • python实现知乎高颜值图片爬取

    2023-03-11 10:35:54
  • 简单的Python2.7编程初学经验总结

    2021-03-18 01:27:11
  • Python数据可视化之分析热门话题“丁克家庭都怎么样了”

    2023-06-02 22:04:07
  • JavaScript实现图片自动加载的瀑布流效果

    2024-06-05 09:13:43
  • js读写COOKIE实现记住帐号或密码的代码(js读写COOKIE)

    2024-04-18 10:11:12
  • asp之家 网络编程 m.aspxhome.com