悟透JavaScript之初看原型 --- (3)

来源:互联网 发布:软件测试发展趋势 编辑:程序博客网 时间:2024/05/16 11:13

原型继承是慈祥而又严厉的。原形对象将自己的属性和方法无私地贡献给孩子们使用,也并不强迫孩子们必须遵从,允许一些顽皮孩子按自己的兴趣和爱好独立行事。从这点上看,原型对象是一位慈祥的母亲。然而,任何一个孩子虽然可以我行我素,但却不能动原型对象既有的财产,因为那可能会影响到其他孩子的利益。从这一点上看,原型对象又象一位严厉的父亲。我们来看看下面的代码就可以理解这个意思了:

functionPerson(name)

{

this.name = name;

};

Person.prototype.company = "Microsoft";//原型的属性

Person.prototype.SayHello =function()//原型的方法

{

alert("Hello, I'm " +this.name + " of " +this.company);

};

varBillGates =newPerson("Bill Gates");

BillGates.SayHello();//由于继承了原型的东西,规规矩矩输出:Hello, I'm Bill Gate

s

varSteveJobs =newPerson("Steve Jobs");

SteveJobs.company = "Apple";//设置自己的company属性,掩盖了原型的comp

any属性

SteveJobs.SayHello =function()//实现了自己的SayHello方法,掩盖了原型的SayH

ello方法

{

alert("Hi, " +this.name + " like " +this.company + ", ha ha ha ");

};

SteveJobs.SayHello();//都是自己覆盖的属性和方法,输出:Hi, Steve Jobs like Ap

ple, ha ha ha

 

BillGates.SayHello();//SteveJobs的覆盖没有影响原型对象,BillGates还是按老样子

输出

对象可以掩盖原型对象的那些属性和方法,一个构造函数原型对象也可以掩盖上层构造函数原型对象既有的属性和方法。这种掩盖其实只是在对象自己身上创建了新的属性和方法,只不过这些属性和方法与原型对象的那些同名而已。JavaScript就是用这简单的掩盖机制实现了对象的多态性,与静态对象语言的虚函数和重载(override)概念不谋而合。

然而,比静态对象语言更神奇的是,我们可以随时给原型对象动态添加新的属性和方法,从而动态地扩展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码:

functionPerson(name)

{

this.name = name;

};

Person.prototype.SayHello =function()//建立对象前定义的方法

{

alert("Hello, I'm " +this.name);

};

varBillGates =newPerson("Bill Gates");//建立对象

BillGates.SayHello();

Person.prototype.Retire =function()//建立对象后再动态扩展原型的方法

{

alert("Poor " +this.name + ", bye bye!");

};

 

BillGates.Retire();//动态扩展的方法即可被先前建立的对象立即调用

阿弥佗佛,原型继承竟然可以玩出有这样的法术!