無標題文檔

面向对象的 Javascript (声明篇)

有时间重新审视了遍 Javascript 的面向对象机制。与其他的语言不同,Javascript 可以说提供了更灵活的面向对象机制(比如 function 在完成其自身功能的同时也是对象)。

由于才疏学浅,我不得不将 《Javascript 高级程序设计》 中的部分内容摘抄过来,这些同时也算是我的读书笔记吧。由于 Javascript 面向对象机制及其的重要,而且内容非常的繁多,在这里就分篇章逐个介绍。

使用对象首先就是声明它(内置的对象当然就不需要了)。该死的 Javascript 总是会让我们死去很多的脑细胞,这篇文章主要说明下声明 Javascript 类的几种方法。

工厂模式

工厂模式可能是很多开发人员使用的一种模式,简单的说这种方法先定义「地基」,然后在往上面扔(绑定)各种功能和属性。下面的代码可能看起来会非常的熟悉:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
    alert(this.color);
}
oCar.showColor();

当然,既然包装成一个类,就要重用它(上面的方法从语法上说仅仅是变量)。可以使用返回特定对象的工厂函数(factory function)将其封装起来:

function createCar() {
    var oCar = new Object;
    oCar.color = "red";
    oCar.showColor = function() {
        alert(this.color);
    }

    return oCar;
}
oCar = createCar();
oCar.showColor();

当然,变通一下,可以在 createCar 函数上加入些参数,这样看起来已经非常地专业了:

function createCar(sColor) {
    var oCar = new Object;
    oCar.color = sColor;
    oCar.showColor = function() {
        alert(this.color);
    }

    return oCar;
}
oCar = createCar();
oCar.showColor();

匿名函数总是让人感觉非常的高深,但是有时候也会迷惑了自己。如果不考虑篇幅,可以外部定义它:

function showColor() {
    alert(this.color);
}

function createCar(sColor) {
    var oCar = new Object;
    oCar.color = sColor;
    oCar.showColor = showColor;

    return oCar;
}
oCar = createCar();
oCar.showColor();

这样做还有一个好处,就是不用重复定义 oCar.showColor 了(高效率的程序每个人都喜欢)。

构造函数模式

构造函数其实和工厂方式差不多。从代码量上来说,就是省略了构造函数内部没有创建一个对象。

function Car(sColor) {
    this.color = sColor;
    this.showColor = function () {
        alert(this.color);
    }
}
oCar = new Car("red");
oCar.showColor();

其实此隐含的对象已经在 new 以后就被实例化了。默认情况下,构造函数返回的就是其 this 的值(所以不必使用 return 返回)。但构造函数模式和工厂模式一样可能会重复定义方法,这点可以参考上述工厂模式的做法避免它(始终看起来不完美)。

原型模式

已经受够重复定义的问题了,那么有没有完美的解决办法呢?当然有。使用原型方法可以有效的避免此类的问题。

function Car() {}
Car.prototype.color = new Array("red", "green", "blue");
Car.prototype.showColor = function() {
    alert(this.color);
}
oCar = new Car();
oCar.showColor();

但是使用此模式需要注意的是类中的所有属性和方法都是共用的(其实就是指针)。这意味着虽然被实例化的两个变量,如果其中一处的值被更改,那么另外一个就也会被更改。

注:此段内容有更改,详细请参见 这里这里 (感谢 fish 兄弟提出)。

混合模式

看起来越来越完美了,结合上述学到的方法就很容易解决原型模式的问题,这样看起来就更像是专业的程序员了。

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

上述的方法声明的类, showColor 方法是原型(仅创建了一个实例),其他的都是构造(互不干扰)。

动态原型模式

把自己的方法仍在外面总不是件非常环保的事情,下面的方法就非常的「绿色」:

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

此方法于上述的混合模式效果一致,即在构造函数内定义属性,而方法则使用原型模式。唯一的区别就是赋予对象方法的位置。

混合工厂模式

混合工厂模式可以认为是构造模式与混合模式的整合,因为 function 本身就是一个对象,所以可以使用 new 来实例化(请允许我这样描述)。

function Car() {
    var oCar = new Object;
    oCar.color = "red";
    oCar.showColor = function() {
        alert(this.color);
    }

    return oCar;
}
oCar = new Car();
oCar.showColor();

不过建议避免使用此方法定义,因为于上述的工厂模式一样,它存在重复声明的问题。

选用何种模式?

其实通过上面的描述已经有所结果,通常使用的是 混合模式 与 动态原型模式 (我个人投动态原型模式一票)。不过不要单独使用 工厂模式 与 构造模式 (或者其两者的结合体),因为这样会造成不必要的浪费。

附,上述的代码 打包下载

未完待续

2008,重装上阵!

不知不觉已经过了这个年了,今天可以说是 2008 年的第一天上班(听着有点讲流水账的味道)。不知道怎么搞的,上班第一天事情比想象中的要少,所以我也无聊写起了 Blog 来。

过年似乎一直都在写一些 无聊的琐事 ,不过似乎大家都很喜欢看我这样的废话。不知不觉, 我的 RSS 订阅数已经超过两百了。不知道这是好事还是坏事,因为这似乎意味着需要更严谨得写东西了。但是不管怎么样, 自己的地盘自己做主 ,写 Blog 本身就是一件很随意的事情。

https://friable.rocks/_/2009_11_05/3912651634b8.jpg

为了纪念我死去的 shuffle,又重新购回 iPod nano 一只,容量不大,只有 1G 而已。说实话我对于 iTunes 的庞大身躯颇有微词,加上 nano 默认配置竟然没有充电器(只有数据线可以充电), 真是对苹果是又爱又恨

用了那么久的电脑,回过头来还是感觉有点唏嘘。遥想当年我的 128MB 的 MP3 按照现在的价格可以买两个 128G 的硬盘了(如果有的话)。不过 我珍藏的那些古董 ,会不会变得非常的有价值呢,比如当年谁会知道某个马槽竟会是司母戊鼎呢。对此,我甚至萌发了收藏全系列 CPU 的冲动。

那么,2008 年能干些什么呢?除了一如既往的 coding 以外,我还想得到属于我自己的苹果笔记本(我不是苹果 fans),原因无他,只是因为已经受够了卡巴和安全卫士月×经式的病毒警报,况且其字体看起来非常的舒服(这也是我为什么在 Windows 下用 Safari 上 Google Reader 原因)。当然,还有个非常实际的期望,就是能给家里减少一份负担。母亲大人的养育之恩是该回报的时候了(别看养生堂的广告了)。

曾经有人问我怎样才算是成功,我当时也是含糊其辞。不过回过头来细想,其实成功仅是一种感觉,每个人都可以拥有。而对于我来说,快乐和满足就是我最大的成功。

我的 2008,重装上阵!

飞凤山庄一游

农历正月初四,于当地县城的飞凤山庄一游。飞凤山庄坐落于城南,依山傍水。水不深,而山也不高,在外人看来,与其叫做山庄,到不如叫公园则更显得恰到好处。

https://friable.rocks/_/2009_11_05/4960751230ff.jpg

母亲已是这里的常客(这里是当地人闲话家常的好去处),拾级而上,不高的山已经不觉的就踏在了脚下。虽说山不高,不过回望县城却俨然尽收眼底。

https://friable.rocks/_/2009_11_05/349785122fd0.jpg

这里就是传说中的飞凤山庄。古朴的阁楼、木质的栅栏却掩盖不了现代生活的喧哗 -- 门前的空地已是现成的停车场。

https://friable.rocks/_/2009_11_05/567395122fb7.jpg

我与母亲来这的目的不一样,非喝茶谈天而来,于是再次带上相机四处去走走、拍拍。虽说还是初春,不过南方温暖的气候已经是一片绿色了。

https://friable.rocks/_/2009_11_05/549825123016.jpg

穿过一片小树林,猛然一座楼阁矗立在眼前。我无从得楼阁的具体历史,但其精致的外表已证明,此已经过后人精心的修葺。

https://friable.rocks/_/2009_11_05/520075123039.jpg

近瞻此楼,发现有一种不同与其他楼阁的动感。「飞凤山庄」,果然犹如此名,有呼之欲出之势。

https://friable.rocks/_/2009_11_05/88052512306d.jpg

这使我想起来一句诗词 -- 「雕栏玉砌应犹在,只是朱颜改」。

https://friable.rocks/_/2009_11_05/9092851230f6.jpg

这座不高的山脚下,就是一条小溪,清澈的河水自然也是经过当地人精心呵护。亭旁溪水涓涓,毋庸置疑,这就本身就是一副最为「中国」的山水画。小溪辗转就流入「隔壁」大河中(我在揣摩此溪是否为人工)。

https://friable.rocks/_/2009_11_05/82973512310b.jpg

既然是旁水而建,必然少不了桥。当地人称这座桥为跃龙桥,而我等年轻人则直接称之为「南门外大桥」。大桥虽然不宏伟,不过横跨两岸对于百姓来说自然方便不少。

https://friable.rocks/_/2009_11_05/842345123124.jpg

古人云「水不在深,有龙则灵」,不知上述的跃龙桥是不是所谓龙的化身呢?看似不深的水,虽无大风却已经泛起了波澜。

https://friable.rocks/_/2009_11_05/102585123146.jpg

当地人喜欢沿河而居,寺庙等自然也就不例外。在跃龙桥旁,有一禅寺,历史据说非常悠久。

https://friable.rocks/_/2009_11_05/490525123168.jpg

寻寻觅觅,有块碑述说了此房的历史,原来此为 方孝孺 年幼读书之处。时过境迁,这里早已经没有了朗朗的读书声,取而代之的是寺庙的钟声与现代生活的熙熙攘攘。

https://friable.rocks/_/2009_11_05/680005139825.jpg

枯木、破墙、石子路,也许,不经意间就会流失很多美好的景色。在此之前,又有谁何尝得知这原来是一座学堂呢?

千言万语尽在不言中,有兴致的朋友可以 到这里 详细查看其他照片。同时,非常期待大家有机会可以亲自去 那里 看看,那里除了山庄中的茶水,其他都是免费的。

我的照片

您好!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,欢迎您通过 GitHubTwitterInstagram 了解我的更多动态。

本博客原名 Gracecode.com 、现更名 「無標題文檔」「精于心、简于形」以此践行极简、务实的理念。 在工作之外的个人生活方面,我崇尚简单、追求平淡,偶尔也带着一些可能不被所有人理解的幽默感。

同时为避免争议和麻烦,在此郑重声明:本站所有内容为非 AI 生成,所有观点及立场均仅代表我个人,不代表任何我所就职或关联的公司与组织。

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

分类

搜索

文章