JavaScript面向对象之prototype.doc
文本预览下载声明
JavaScript面向对象之prototype
什么是prototype属性?Prototype属性有什么作用?
1、prototype对象是实现面向对象的一个重要机制。每个函数也是一个对象,它们对应的类就是
function,每个函数对象都具有一个子对象prototype。Prototype 表示了该函数的原型,
prototype表示了一个类的属性的集合。当通过new来生成一个类的对象时,prototype对象的属
性就会成为实例化对象的属性。
下面以一个例子来介绍prototype的应用,代码如下:
当用new创建一个对象时,prototype对象的属性将自动赋给所创建的对象,例如:
2、利用prototype实现继承
在以上的代码中,首先是HelloSubClass具有了和HelloClass一样的prototype,如果不考
虑构造方法,则两个类是等价的。随后,又通过prototype给HelloSubClass赋予了额外的属性和方法
所以HelloSubClass是在HelloClass的基础上增加了新的属性和方法,从而实现了类的继承。
在Javascript中,object就是个associative array。一个function就是个类。当你编写如下function时,其实就是定义了一个类,该function就是他的构造函数。
function MyObject(name, size)
???????{
??????????????this.name = name;
??????????????this.size = size;
???????}
之后,你能方便的通过MyObject类的prototype属性来方便的扩充他。比如,你能给他添加其他的属性和方法。
???????MyObject.prototype.tellSize = function()
???????{
??????????????return size of +this.name+ is +this.size;
???????}
??????
???????MyObject.prototype.color = red;
???????MyObject.prototype.tellColor = function()
???????{
??????????????return color of +this.name+ is +this.color;
???????}
??????
???????var myobj1 = new MyObject(tiddles, 7.5 meters);
???????domDiv.innerHTML += myobj1.tellColor()+br /br /;
你能想象,当你调用tellColor()方法后,结果是这样的:
color of tiddles is red
非常方便的是,prototype属性能动态添加。比如,你需要往MyObject中加入一个height属性,并希望其提供一个tellHeight()方法来获得height属性的值。你能在上面的代码后,继续添加如下的代码:
???????MyObject.prototype.height = 2.26 meters;
???????MyObject.prototype.tellHeight = function()
???????{
??????????????return height of +this.name+ is +this.height;
???????}
之后,你能访问一下myobj1的tellHeight()方法,你能得到如下的结果:
height of tiddles is 2.26 meters
prototype的这些动态的特性看起来有些迷人,不过我倒是反而觉得有些凉飕飕的。确实,这些特性给你非常大的灵活性,能给和你runtime改动类属性和方法的能力。不过,稍微发掘一下,会有些不良的习惯产生。
首先,如果能动态添加属性和方法,那么非常容易让人想到,当我调用时,我想要调用的属性或方法存在不?这是个非常严肃的问题,如果当我们调用时根本没有该属性或方法,将可能导致我们的脚本down掉。
不过也有解决办法。比如,在上面的代码中,当还没有tellHeight()方法时,我们能如下编写代码避免发生错误:
???????if (myobj1.tellHeight)
???????{
??????????????domDiv.innerHTML += myobj1.tellHeight()+br /br /;
???????}
注意,一定要在if语句中,不要加方法后面的那对(),否则,直接就down掉了。有兴趣的读者能打印一下,
显示全部