Prototype 框架分析(一)
Class
关于javascript的面向对象设计可以参看MSDN上的文章《JavaScript使用面向对象的技术创建高级 Web 应用程序》,这样理解起来更加容易。
- Class的声明
Prototype的帮助文档中关于Class的介绍中有下面的例子:
var Animal = Class.create();
Animal.prototype = {
initialize: function(name, sound) {
this.name = name;
this.sound = sound;
},
speak: function() {
alert(name + " says: " + sound + "!");
}
};
var snake = new Animal("Ringneck", "hissssssssss");
snake.speak();
// -> alerts "Ringneck says: hissssssssss!"
//snake.name = "NewRingneck";
//snake.speak();
//如果更改了Animal的名字,它的speak方法仍然是初始化的状态。
//原因就在于js的闭包原理,所以speak方法应该为
//alert(this.name + " says: " + this.sound + "!");
这里Class.create()返回了一个函数,也就是说变量Animal是一个函数。而这个函数的功能就是调用Obj的initialize方法,从而实现类的初始化。因此每个类必须要有initialize方法。
- Class的继承
Class的继承其实就是更改对象的prototype:
//接着上面的例子
var Dog = Class.create();
//Object.extend方法返回Animal对象,并且给这个Animal增加了
//initialize方法,而根据js运行时可以知道会覆盖先前Animal
//的initialize方法。不过这里Dog.prototype的constructor方法没有改变跟Animal.prototype一致。
//当然如果不用constructor方法也就可以忽略这一点了。
Dog.prototype = Object.extend(new Animal(), {
initialize: function(name) {
this.name = name;
this.sound = "woof";
}
});
var fido = new Dog("Fido");
fido.speak();
// -> alerts "Fido says: woof!"