博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
传统的继承在JavaScript中的应用
阅读量:6695 次
发布时间:2019-06-25

本文共 4098 字,大约阅读时间需要 13 分钟。

  原文地址:

已经存在翻译了:

  简单的意译,JavaScript仿照传统的继承方式进行继承(如:Java的继承方式)

  JavaScript是一种弱类型,面向对象的语言,正因为如此,它使用原型继承,而不是经典的继承。这些让使用传统的面向对象语言,如C++和Java的程序员很不能理解。 JavaScript的原型继承比传统的继承有着更强的表现力。

  不过要问,我们为什么关心继承呢?主要有两个原因:

  第一:类型的便利。我们想要的语言系统自动转化相似类的引用。强类型语言(如Java),类型系统要求对对象的引用要进行显示的类型转换,而对于弱类型的JavaScript中的对象引用不存在转换问题。

  第二:代码的重用。有一定数量的对象实现了相同的方法,或者一个对象与其他对象具有共同部分,其余都是给该对象增加或减少少量的方法,这时候就用继承来提取公共部分,这将是非常有用。而JavaScript的Prototype继承更加有用。

 下面是用JavaScript来模仿传统的继承。

 Java示例:类Parenizor

public class Parenizor{    private String value;                                                                                                                                                                                                                                                                                              public Parenizor(value){        this.value=value;    }                                                                                                                                                                                                                                                                                              public void setValue(value){        this.value=value;    }                                                                                                                                                                                                                                                                                              public String getValue(){        return this.value;    }                                                                                                                                                                                                                                                                                              public String toString(){        return "Parenizor[value:"+value+"]";    }                                                                                                                                                                                                                                                                                          }

 JavaScript示例:原型对象Parenizor

function Parenizor(value) {    this.setValue(value);}Parenizor.method('setValue', function (value) {    this.value = value;    return this;});Parenizor.method('getValue', function () {    return this.value;});Parenizor.method('toString', function () {    return '(' + this.getValue() + ')';});

 上面JavaScript模仿的例子还不能使用,method是Function内置对象的方法,而该方法是用户自己为Function对象添加的原型方法。因此要添加如下方法,上面JavaScript模仿Java的类定义中的方法才能正常使用。

 Function.prototype.method方法如下:

Function.prototype.method = function (name, func) {    this.prototype[name] = func;    return this;};

关于继承:再次扩充了函数,使它继承了父类的一个实例并将它用于一个新的原型,并且修改constructor部分,并将uber方法一并添加到这个原型中来了。

Function.method('inherits', function (parent) {    this.prototype = new parent();    var d = {},        p = this.prototype;    this.prototype.constructor = parent;    this.method('uber', function uber(name) {        if (!(name in d)) {            d[name] = 0;        }        var f, r, t = d[name], v = parent.prototype;        if (t) {            while (t) {                v = v.constructor.prototype;                t -= 1;            }            f = v[name];        } else {            f = p[name];            if (f == this[name]) {                f = v[name];            }        }        d[name] += 1;        r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));        d[name] -= 1;        return r;    });    return this;});

关于多继承:

使用函数的Prototype对象是可以实现多继承的,通过使用多个类来构造一个新类,不过这样的多重继承会很复杂和不易维护。

Function.method('swiss', function (parent) {    for (var i = 1; i < arguments.length; i += 1) {        var name = arguments[i];        this.prototype[name] = parent.prototype[name];    }    return this;});

   swiss方法中循环访问arguments数组中的元素。对于每一个名称,它从父级prototype中复制一个member到它的新类的prototype中去。

   使用方式:

 

ZParenizor.swiss(NumberValue, 'setValue', 'setRange');

  只需要为ZParenizor添加上需要的NumberValue的方法setValue和setRange.

译文末:

  传统意义上的对象是固化的,只有新建一个类才能添加对象的成员。但是在JavaScript中,对象是开放的,能够非常方便的添加成员。

转载地址:http://dtpoo.baihongyu.com/

你可能感兴趣的文章
CentOs
查看>>
Dockerfile编写(备份)
查看>>
解决Ubuntun 12.04编译Mesa10.3 WARNING: 'aclocal-1.14' is missing on your system
查看>>
junit设计模式--适配器模式
查看>>
关于门诊处方的一次计量保留小数点的问题
查看>>
Java常见面试题汇总(一)
查看>>
JAVA如何实现深拷贝
查看>>
[sphinx]中文语言模型训练
查看>>
CHIL-SQL-NOT NULL 约束
查看>>
最短路径 - 弗洛伊德(Floyd)算法
查看>>
FlasCC例子研究之Drawing补充
查看>>
省市县结合身份证号6位码的三级联动
查看>>
common.js
查看>>
Oracle(转换函数)
查看>>
构建高性能数据库缓存之redis(二)
查看>>
sdk 升级,search path,
查看>>
好吧,排列组合,
查看>>
Spring MVC Ajax 嵌套表单数据的提交
查看>>
css实现半颗星评分效果
查看>>
nodejs,事件轮询总结
查看>>