这些类有层次之分吗?
另一个好问题的是javascript的类是否有层次之分。回答是肯定有。我们来仔细看看是怎么做到分层的。我们可以定义一个rectangle子类,并把figure作为父类:
function rectangle(startx, starty, endx, endy) {
this.width = endx – startx;
this.height = endy – starty;
this.centerx = (endx + startx)/2;
this.centery = (endy + starty)/2;
this.computearea = computearea;
function computearea() {
this.area = this.width*this.height;
} }
rectangle.prototype = new figure();
rectangle对象是用4个自变量创建的,前四行是构造器。 rectangle类包含了一个方法: computearea()。最后一行rectangle.prototype = new figure();,把rectangle类定义为从figure类继承来的子类。
然我来解释一下prototype(原型)。每个对象构造器都有prototype属性;这是用来给所有的对象增加新属性和方法的。这就是为什么原型被用来实现继承:child.prototype = new parent();。通过原型,父对象的所有属性和方法都被添加到子对象上。
要注意this.centerx,this.centery,和area是rectangle类中所使用的属性,但是它们是 figure父类的属性。和rectangle类相似,circle类可以被定义成figure类的原型。这种父子关系可以按你需要来定义深度;你可以创建另一个rectangle的子类。
我如何创建一个类的实例?
在javascript里创建一个类的实例很容易:
rect = new rectangle(100,100,900,800);
这就创建了rectangle类型的一个对象。rectangle的构造器在属性width, height, centerx, 和centery中填入了值。rect.area属性的值是零(0)。使用这个命令就能调用area方法:
rect.computearea();
rect.area的值现在是560,000。要调用transform方法使用:
rect.transform(100,200,0);
父和子对象的属性可以像这样访问到:
var ar = rect.area;
var wi = rect.width;
我能超越属性和方法吗?
就像你在java中的一样,你可以超越属性和方法。在子类中定义的属性或者方法可以超越同名的父类的属性和方法。
和全局变量互动
javascript也支持全局变量的使用。在以下代码段中测试一下g_area变量的范围:
<html>
<script>
var g_area = 20;
function figure() {
…
this.area=g_area;
…
}
function rectangle(){ … }
rectangle.prototype = new figure();
function test(){
g_area = 40;
rect = new rectangle();
alert(rect.area);
}
</script>
<body onload = test()/>
</body>
</html>
rect.area的值是20(不是你预计的40),这是因为rectangle对象是figure对象的原型,这种关系在test()被调用以前就被定义了。要使用g_area的新值,你需要用以下的方法:
function test() {
g_area = 40;
rectangle.prototype = new figure();
rect = new rectangle();
alert(rect.area);
}
对于所有的rectangle的新实例,这将改变area属性的值。或者,你可以使用这种方法:function test() {
g_area = 40;
rect = new rectangle();
rectangle.prototype.area = g_area;
alert(rect.area);
}
这将改变rectangle所有现存的以及新实例的area属性的值。
结论
为了效仿oo开发,javascript提供了必需的继承、封装和超越属性,尽管它不支持接口和方法的过载。如果你是刚接触到oo开发,用它试试。oo概念允许开发者将一组数据和相关操作集中入一个对象。这在管理浏览器事件和管理浏览器内svg图时很有用。
