Archive for 二月, 2008

基于javascript的面向对象的实现

Posted by 机器人 on 27th 二月 2008 in php/javascript

一 类的定义

1.静态属性和方法

js并没有静态作用域,不过它可以给构造函数提供属性和方法:

function sayHi(){
    alert("hi");
}
sayHi.alternate = function(){
    alert("hoal");
}
sayHi();//outputs "hi"

2. 关键字this

它用在对象的方法中,总是指向调用该方法的对象.

注意:引用对象的属性时,必须使用this关键字

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

3.工厂模式

   

function showColor(){
     alert(this.color);
}
function createCar(sColor,iDoors,iMpg) {
    var oTempCar = new Object;
    oTempCar.color = sColor;
    oTempCar.doors = iDoors;
    oTempCar.mpg = iMpg;
    oTempCar.showColor = showColor;
    return oTempCar;
}
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("green",3,25);

oCar1.showColor();
oCar2.showColor();

4.构造函数

 

function Car(sColor,iDoors,iMpg) {
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
    this.showColor = function (){
        alert(this.color);
    }
}
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);

oCar1.showColor();
oCar2.showColor();

在构造函数内部无创建对象,而是使用this关键字.使用new运算符调用构造函数时,在执

行第一行代码前先创建一个对象,只有用this才能访问该对象.然后可以直接赋予this属性

.默认情况下是构造函数的返回值(不必明确使用return运算符)

5.混合的构造函数/原型方式

 

function Car(sColor,iDoors,iMpg) {
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
}
Car.prototype.showColor = function (){
        alert(this.color);
    }
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.showColor();
oCar2.showColor();

构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)

alert(oCar1 instanceof Car);

instantceof oCar1是否是Car的一个对象..

6.动态原型方法

function Car(sColor,iDoors,iMpg) {
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
    if (typeof Car._initialized == "undefined"){
        Car.prototype.showColor = function (){
            alert(this.color);
        }
    }
    Car._initialized = true;
}
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.showColor();
oCar2.showColor();

7.字符串的连接建议使用Array对象

var arr = new Array();
arr[0] = "hello";
arr[1] = "world";
var str = arr.join("");
alert(str);
设计StringBuffer类打包该功能:
function StringBuffer(){
    this.__strings__ = new Array;
}
StringBuffer.prototype.append = function(str){
    this.__strings__.push(str);
}
StringBuffer.prototype.toString = function(){
    return this.__strings__.join("");
}
var buffer = new StringBuffer();
buffer.append("hello ");
buffer.append("world");
var result = buffer.toString();

可能节省100%~200%的时间

8.创建新方法

如果想结每个本地对象添加新方法,必须在Object对象的prototype属性上定义它,因为每

个对象都是继承了Object对象,所有驿Object对象做任何改变,都会瓜在所有本地对象中.

. 

Object.prototype.showValue = function(){
    alert(this.valueOf());
}
var str = "hqlong";
var iNum = 24;
str.showValue();
iNum.showValue();

9.重定义已有方法

function.prototype.toString = function(){
    return "Function code hidden";
}

toString指针被无用存储单元回收程序回收,这样原函数将完全被废弃,所以在存储原函数

之前,最好存储它的指针,这样会比较安全.

function.prototype.originalToString = Function.prototype.toString;

10.极晚绑定

对象实例化以后定义对象的方法.

var o = new Object;
Object.prototype.sayHi = function(){
    alert("hi");
}

 

不建议使用极晚绑定方法,因为很难对其进行跟踪和记录..

二 继承机制

1.对象冒充

function ClassA(sColor){
    this.color = sColor;
    this.sayColor = function(){
        alert(this.color);
    }
}
function ClassB(sColor,sName){
    this.newMethod = ClassA;
    this.newMethod(sColor);
    delete this.newMethod;
    this.name = sName;
    this.sayName = function(){
        alert(this.name);
    }
}
var objA = new ClassA("red");
var objB = new ClassB("blue","Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();

2.call()方法

它的第一个参数用作this的对象,其他参数直接一地一的传给函数自身.

function ClassA(sColor){
    this.color = sColor;
    this.sayColor = function(){
        alert(this.color);
    }
}
function ClassB(sColor,sName){
    ClassA.call(this,sColor);
    this.name = sName;
    this.sayName = function(){
        alert(this.name);
    }
}
var objA = new ClassA("red");
var objB = new ClassB("blue","Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();

3.apply()方法

用作this的对象和要传递给函数的参数的数组

function ClassA(sColor){
    this.color = sColor;
    this.sayColor = function(){
        alert(this.color);
    }
}
function ClassB(sColor,sName){
    ClassA.call(this,new Array(sColor));
    this.name = sName;
    this.sayName = function(){
        alert(this.name);
    }
}
var objA = new ClassA("red");
var objB = new ClassB("blue","Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();

如果超类中的参数顺序和中的参数顺序完全一致,可以使用arguments对象作为第二个参数

传递给apply

方法.

4.原型链:

这种方式是基于对象原型的,prototype对象是个模板,要实例化的对象都以这个模板为基

础,prototype对象的任何属性和方法都被传递给那个类的所有实例.原型链利用这种功能

来实现继承机制.

function ClassA(){}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function(){
    alert(this.color);
}
function ClassB(){}
ClassB.prototype = new ClassA();

这里,把ClassB的属性设置成ClassA的实例.这里很有意思,因为想要ClassA的所有属性和

方法,但又不想逐个将它们赋予ClassB和prototype属性.恐怕没有比这更好的方法了.

Notice:调用ClassA的构造函数时,没有给它传递参数.这里在原型链中是标准做法.要确

保构造函数没有任何参数.

子类的所有属性和方法都必须出现在prototype属性被赋值后,因为在它之前的所有赋值都

会被删除.

5.混合方法:

主要是在原型链在基础上使用构造函数

 

function ClassA(sColor){
    this.color = sColor;
}
ClassA.prototype.sayColor = function(){
    alert(this.color);
}
function ClassB(sColor,sName){
    ClassA.call(this,sColor);
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function(){
    alert(this.name);
};

机器人 2008年2月28日 于 整理于 北京

参考资料: http://book.csdn.net/bookfiles/110/1001103139.shtml

2008编程语言走势解盘

Posted by 机器人 on 19th 二月 2008 in php/javascript

农历新年前,许多大师或老师会对名人、股市、甚至国家的运势做出各种分析,这倒是让我灵光乍现,想利用这段时间概略地分析今年编程语言的可能发展。

Java类语言:Java似乎会逐渐走下坡。J2ME会受到Google Android、Adobe Flash Lite、.NET Compact Framework的影响;J2SE的对手则是.NET和AIR;J2EE在中小型网站受到PHP、Ruby-on-Rails(RoR)很大的冲击。幸好,目前大型企业好像还是买J2EE的帐。

在J2ME和J2SE方面,未来似乎可以用JavaFX奋力一搏;在J2EE方面,也有Groovy/Grails可以抵挡RoR。尤其目前大家怀疑PHP和RoR只适合用在中小型网站,大型企业网站似乎还是用J2EE比较安心,Groovy/Grails可以保障大家在J2EE上既有的投资。如果你是Java爱好者,最近有点想改用RoR,那么你可以去看看Grails,或许你会因此想继续留在Java阵营。

PHP语言:因为PHP对初学者相当友善,所以过去这几年使用者数量增加快速,但是似乎已经到达瓶颈,这可能是RoR造成的。随着RoR推出新版,PHP会受到更大的挑战。连开发工具厂商CodeGear都在2007年推出Ruby和PHP的开发工具,显见这两个语言似乎都会逐渐走入企业市场。

Python语言:Python早就移植到.NET和Java,2008年会持续推出修订版本,而且也会推出全新的Python 3000。Python 3000不以相容于2.x版为目的,而是要运用过去培养出来的经验,彻底翻新Python。目前Python编程员的需求也已经超越Perl。

Perl语言:目标远大是一件好事,但目标远大却没有足够的资源可以完成目标,就会陷入绝境。Perl 6就是这样的例子,它比.NET更早提出,但这几年下来,.NET已经从1.0进入到3.5,Perl 6却连1.0都还没诞生。Perl擅长文字数据处理,但是在大部分语言都支持Regular Expression,加上文字数据大量XML化之后,Perl的优势已经消失大半。

Ruby语言:Ruby可能会在2008年推出2.0,加上2007年底已经推出的RoR 2.0, Ruby整个就是一股挡不住的气势。可能在2008年底之前,Ruby在TIOBE的排行榜上就会超越Perl,只剩下Python和PHP这两个对手了。

JavaScript语言:Web应用蔚为主流,而JavaScript又是浏览器的标准语言,所以这几年来相当受到重视。在Adobe推出AIR,Mozilla推出Prism之后,JavaScript可以开发出「某些种类」的桌面应用,JavaScript的用途变得更广。而JavaScript的兄弟ActionScript,随着AIR的推出又会更受欢迎一些,但是Silverlight的推出,又会抵销ActionScript成长力道。

C语言:系统语言语言方面,C语言的地位还是一样重要,C++则会慢慢走下坡;D语言崛起,将会接收相当多原来C++的使用者,而Delphi则是一蹶不振,当年Delphi/Kylix跨Windows/Linux的美梦已然消失。

D语言:多年来,D语言平均一个月推出两个版本,改版速度相当快,在2007年1月推出1.0版后,不出几个月,又推出2.0版。1.0版持续做bug修订,尽量不加新特色,2.0版则继续进行实验性的翻修。虽然D语言1.0才正式推出1年,但已经成为相当受欢迎的系统语言,可惜至今仍然没有很好用的IDE。

Lua、PowerShell、Erlang语言:可说是未来几年窜升力道最强的潜力之星,但都还不至于成为主流语言。Lua是相当小的语言,适合嵌入其他的环境中,和其他语言一同使用,根据TIOBE开发语言排行榜数据显示,这几年Lua越来越受到重视,尤其2007年Lua更是往上猛窜二十几个名次,由此可见Lua的需求大增。随着Windows Vista系统的出货,未来几年PowerShell会成为相当重要的系统管理语言。目前的多核心环境、网络分布式计算、容错的需求,则让Erlang持续受到重视。

Roughly Drafted Magazine的报导指出,在2007年第三季,Apple iPhone在美国的Smartphone市场占有率已经到达27%,超过Windows Mobile。继美洲和欧洲之后,2008年iPhone会在亚洲开始贩卖,并推出第二代机种,也预计在2008年推出SDK(软件开发工具包),让我们可以为iPhone写原生(Native)程序。

所以,如果你需要为Smartphone开发应用,除了考虑Windows Mobile之外,你也必须思考是否要用Objective-C语言开发的MacOS应用了(iPhone使用精简版的MacOS X)。

转换语言的成本通常很高,所以一年之内,各个语言通常不会有太大的兴衰变化,这篇文章其实是描述以2008为中心,前后数年期间各类编程语言的整体状况;把时间拉长,发展态势会比较明显,不受到短期震荡的影响,预测未来就不至于太过离谱,让大家当作未来选择语言的参考。

作者简介:

蔡学镛-技术顾问

清华大学资讯工程硕士,曾任华硕集团软件工程师、元智大学信息系讲师、美商欧莱礼出版社技术编辑、台湾微软特约专栏作家

机器人 2008-2-19 转载于 北京

为什么有钱人不一定取美女

Posted by 机器人 on 17th 二月 2008 in 未分类

一个年轻漂亮的美国女孩在美国一家大型网上论坛金融版上发表了这样一个问题帖:我怎样才能嫁给有钱人?

“我下面要说的都是心里话。本人25岁,非常漂亮,是那种让人惊艳的漂亮,谈吐文雅,有品位,想嫁给年薪 50万美元的人。你也许会说我贪心,但在纽约年薪100万才算是中产,本人的要求其实不高。

这个版上有没有年薪超过 50万的人?你们都结婚了吗?我想请教各位一个问题——怎样才能嫁给你们这样的有钱人?我约会过的人中,最有钱的年薪 25 万,这似乎是我的上限。要住进纽约中心公园以西的高尚住宅区,年薪25万远远不够。我是来诚心诚意请教的。有几个具体的问题:

一、有钱的单身汉一般都在哪里消磨时光?

(请列出酒吧、饭店、健身房的名字和详细地址。)

二、我应该把目标定在哪个年龄段?

三、为什么有些富豪的妻子看起来相貌平平?我见过有些女孩,长相如同白开水,毫无吸引人的地方,但她们却能嫁入豪门。而单身酒吧里那些迷死人的美女却运气不佳。

四、你们怎么决定谁能做妻子,谁只能做女朋友? 

(我现在的目标是结婚。)”

——波尔斯女士

下面是一个华尔街金融家的回帖:

“亲爱的波尔斯:我怀着极大的兴趣看完了贵帖,相信不少女士也有跟你类似的疑问。让我以一个投资专家的身份,对你的处境做一分析。我年薪超过50万,符合你的择偶标准,所以请相信我并不是在浪费大家的时间。

从生意人的角度来看,跟你结婚是个糟糕的经营决策,道理再明白不过,请听我解释。抛开细枝末节,你所说的其实是一笔简单的“财”“貌”交易:甲方提供迷人的外表,乙方出钱,公平交易,童叟无欺。但是,这里有个致命的问题,你的美貌会消逝,但我的钱却不会无缘无故减少。事实上,我的收入很可能会逐年递增.而你不可能一年比一年漂亮。

因此,从经济学的角度讲,我是增值资产,你是贬值资产,不但贬值,而且是加速贬值!你现在25,在未来的五年里,你仍可以保持窈窕的身段,俏丽的容貌,虽然每年略有退步。但美貌消逝的速度会越来越快,如果它是你仅有的资产,十年以后你的价值甚忧。

用华尔街术语说,每笔交易都有一个仓位,跟你交往属于“交易仓位”(tradingl position),一旦价值下跌就要立即抛售,而不宜长期持有 ——也就是你想要的婚姻。听起来很残忍,但对一件会加速贬值的物资,明智的选择是租赁,而不是购入。年薪能超过50万的人,当然都不是傻瓜,因此我们只会跟你交往,但不会跟你结婚。所以我劝你不要苦苦寻找嫁给有钱人的秘方。顺便说一句,你倒可以想办法把自己变成年薪50万的人,这比碰到一个有钱的傻瓜的胜算要大。

希望我的回帖能对你有帮助。如果你对“租赁”感兴趣,请跟我联系。”

——罗波.坎贝尔(J·P·摩根银行多种产业投资顾问)

机器人 2008-2-17 于 北京

怎么培养自己的工作激情

Posted by 机器人 on 16th 二月 2008 in mylife