無標題文檔

面向对象的 Javascript (继承篇)

继续我们的 Javascript 面向对象之旅。 上次 已经提到过怎么去声明个 Javascript 类了,这篇主要是说明如何去继承 Javascript 类。

相对于其他语言而言,Javascript 类的机制显得尤其的宽松。这似乎是把双刃剑,使用不当就有可能割伤自己的手指。Javascript 没有严格意义上的抽象类的概念,这就意味着任何的类都可以被实例化。

在开始下面的文章前,我们首先重新认识下上篇我们已经定义好的类。

function Car(sColor) {
    this.color = sColor;
    this.showColor = function() {
        alert(this.color);
    }
}

是的,看起来非常好理解。那么接下来就开始在 Car 上加装点东西使它变成更具体化。

对象冒充

对象冒充(object masquerading)是日常 coding 中最常见的一种类继承的手法。其原理就是,构造函数使用 this 关键字给所有的属性和方法赋值。

因为构造函数只是一个函数,所以可以使基类的构造函数成为继承类的一个方法。这样,继承类就能收到基类构造函数中定义的属性和方法。例如上述的 Car 基类就可以这样继承。

function Trunk(sColor, sName) {
    this.Car = Car;
    this.Car(sColor);
    delete this.Car;

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    }
}

在这里要需要注意一点,新属性和新的方法比必须在删除了新方法的代码后定义,否则可能会覆盖继承类的相关属性和方法。

深刻理解 Javascript 的 this 和函数机制是非常有用的。依次类推,我们就可以给让一个类继承多个基类(多重继承)。

call() 方法

了解对象冒充的机制以后使用 call() 方法就非常容易理解了。从代码量上理解,它仅仅是将上述方法的三条语句合并成一条(是的,没有任何的不同)。

function Trunk(sColor, sName) {
    //this.Car = Car;
    //this.Car(sColor);
    //delete this.Car;
    Car.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    }
}

有关如何使用 call() 的其他信息,可以访问 这里获得

apply() 方法

相对于 call() 方法,自然对于 apply() 方法也同样能够运行。只不过其参数是以数组的形式传递,请参考下面的代码。

function Trunk(sColor, sName) {
    //this.Car = Car;
    //this.Car(sColor);
    //delete this.Car;
    Car.apply(this, [sColor]);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    }
}

当然,继承类的参数顺序与基类的参数顺序完全一致才可以传递参数对象。即便只有一个参数,也需要使用数组传递(比如上述的例子)。

原型链

上篇文章 已经介绍了使用原型方式定义类,而原型链扩展了这种方式,这种继承的方式非常的有趣。其实 prototype 对象是个模板,要实例化的对象都以这个模板为基础(我个人将这里的「模板」理解为指针)。

总而言之,prototype 对象的任何属性和方法都会被传递给那个类的所有实例,而原型链就是利用这种功能来实现继承机制,且看下面的代码实现。

function Car() {
}
Car.prototype.color = "red";
Car.prototype.showColor = function () {
    alert(this.color);
}

Trunk.prototype = new Car;

从代码中可以得知,调用 Car 的构造函数时,没有给它传递任何的参数。这在原型链中视标准的做法,要确保构造函数没有任何的参数。

原型链的弊端就是不支持多重继承,同时与艳星连会用另一类型的对象重写基类的 prototype 属性(就犹如上篇类的声明说所言的道理一样,所以我个人将其理解为指针)。

混合模式

同类的声明机制一样,两种方法(对象冒充和原型链)也可以结合在一起实现继承机制。比如下面是一个非常「完美的」类声明。

function Car(sColor) {
    this.color = sColor;
    if (typeof Car._initialized == "undefined") {
        Car.prototype.showColor = function() {
            alert(this.color);
        };
        Car._initialized = true;
    }
}

要继承这个类必须使用两种方式同时使用,应为类的声明中也使用了两种方式。

function Trunk(sColor, sName) {
    Car.call(this, sColor);
    this.name = sName;
}

Trunk.prototype = new Car();
Trunk.prototype.showName = function () {
    alert(this.showName);
}

由于混合方式使用了原型链,所以 instanceof 运算符仍然能够正确的运行。

理论方面的东西就到这里为止,接下来计划说点实际的东西。不过还是调下大家的胃口,我打算安排在下一篇文章中说明,敬请期待。

未完待续

心目中的完美键盘,Cherry

说到键盘,很多朋友都可能会想起微软、罗技这样的品牌,他们的顶级产品通常也只需要几十美金(约合几百人民币)。但是如果我告诉你一款键盘能卖到人民币一千多以上,你保证会认为我疯了。

https://friable.rocks/_/2008_02_18/1203264082.jpg

是的,是有这样的键盘在卖,而且销量相当的好。这个键盘的品牌就是 Cherry 。Cherry 这个品牌我也是偶尔使用了它的产品以后才得知,说实话我至今都无法忘记此键盘的手感。至于具体的介绍,我还是摘抄一段如下。

「Cherry」全名为「Cherry GMBH」,1965 年成立于德国。主要从事各种输入周
边及开关(Switch)的生产。CHERRY在欧洲和北美洲的知名度相当高(相当于这
里的微软、罗技),相反在亚洲就几乎没有什么人知道。其实这跟 Cherry 的定
位有关系,它的客户一般只针对那些大型的公司、研究所、以及科教文卫单位等,
DIY 市场方面的推广则极其匮乏。

有可能你至今都无法相信什么样的键盘会卖这么贵,其实原因很简单,主要是 Cherry 不计成本的用料。

元老级的玩家都知道在「上古」时期的键盘价格都是非常贵的(现在 SUN 的服务器还是保持了这一传统)。此原因有很多种,其中之一就是机械键盘高昂的用料成本和繁杂的工艺流程。这一现象直到目前的薄膜键盘问世才得以解决。

https://friable.rocks/_/2008_02_18/1203264545.jpg

Cherry 是一家非常「顽固」的公司,以至于它至今还是保持了机械键盘的制造传统,这是因为对于手感和使用寿命的不懈追求。比如上图,就是针对不同色轴的测试,分别为棕轴、黑轴和蓝(白)轴(轴是机械键盘主要的机械装置,它很大程度决定了击键的手感和使用寿命)。

https://friable.rocks/_/2008_02_18/1203264116.jpg

典型的 Cherry 键盘除了延续几十年的机械键盘制造工艺以外,还是有两个非常明显的特征。首先就是从来不会使用「廉价」的 ABS 塑料,取而代之的是采用高耐磨度和耐热度的 PBT 塑料。另外一个特点就是键帽使用双色塑料压模成型(二色成形),这意味着键字永远不会被磨损。

Cherry 如此不计成本的用料加上高超的制造工艺,让它的每一块键盘都是经受得起上千万次的敲打。在每个使用者心目中,Cherry 的键盘是唯一能使用二十年的计算机硬件设备(这是国产品牌难以想象的)。

https://friable.rocks/_/2008_02_18/1203264142.jpg

想知道德国佬对于自己的产品有多么的自信? 看看这里 ,他们甚至用辆汽车压 Cherry 键盘(内容为德文)。

https://friable.rocks/_/2008_02_18/1203264172.jpg

对于程序员来说,好的键盘就犹如厨子有把好刀一样,本人就一直梦想能有一块 Cherry 的键盘(不排除游戏使用)。

大家可能会很奇怪,我为什么会突然推销起键盘来。今天独自一人在公司 加班 ,结果在办公桌上抽烟,烟头把伴随我多年的「小白」给烫了( wiLdGoose 兄 请见谅)。

琐事一堆,懒得理

过年以后就似乎注定着事情会特别得多。

与老母在电话中得知, 说可能今年要租房子住了 。对此我很是匪夷所思,明明是有我们自己的房子的,为什么要搬出去住?老母无奈的说了一句,政×府说我们的新房子还没有安置好,但是先要让我们搬出来住。

https://friable.rocks/_/2009_11_05/05299516342a.jpg

我但愿她老人家再次神经过敏(这里没有咒她老人家的意思),否则 我的那些家当 就完全有可能没有了。对于此,我相信包括我家在内的所有要搬迁户都会有个合理的说法(2008 年的确是重要的一年)。但是,我不想有任何媒体的介入,否则我晚上睡觉都可能会梦见,母亲拿着枚钥匙,在镜头面前含着泪直夸「××好,××是我们的大救星。」

不过,是的,这的确是个噩梦。

``

这年头买个感冒药都比买春×药要难。屋漏偏逢连夜雨,这几天 小妮子 偶感风寒,害得我晚上十点多都得跑出去买药(的确有点晚了)。可怜就近的药店都关门了,突然想起附近有家医院(就不点名了),遂犹如找到绿洲般奔向那里。

「您好,你这里有感冒药买吗?」
「没有!」(请注意这个感叹号)
「您这里不是医院吗,怎么会没有药买呢?」
「我们不卖药,生病挂急诊。」

这个时候我发现我是天底下最幸运的人,幸亏妮子患的是感冒!对此,我不想多言,别人说的我都有理由不相信,而这次的的确确是真正经历过了。

最可笑的是,深夜灯火阑珊,我失意得走在回家的路上,突然看见张硕大的广告牌,粉红色的霓虹灯勾绘出一个字:「药」。但我的兴奋的之情在三秒钟瞬间被蒸发,那是家卖 保健品 的。

``

在月底前离开我从实习至今的公司,心情很复杂,对于未来的期待同时也有些许的酸楚。离开公司的原因有很多,期间我在 Blog 上或多或少的提到过。

在离开之前我答应 Badbuild 启动新的项目,说实话我至今还是在犹豫中,我是非常希望能有个开头,同时也能有个结尾。但不管怎么样,不管结果如何,我希望能在最后那么短的时间内帮上团队的忙。

对于此的最终结果是什么,说实话我自己也不讲清楚。但是我突然意识到,其实真正 优秀的团队 最需要的不是拥有多么高超的技术,而是活跃的思维和创新的意识。

``

最后,我不知道在 Blog 上聊这些东西合不合适,但毕竟只有在宣泄了以后才会觉得舒服,压抑了太久恐怕会出现问题。不管怎么样,对于未来,就犹如我 前面所言 ,还是充满了信心的。

这些都是些琐事,懒得理、不用理,自己尽心尽力(说着耳熟)、问心无愧,就可以了。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章