create
create([superclass][, methods...]) -> Class
创建一个类。
Class.create
返回一个函数,当该函数被调用时,会自动调用它自己的 initialize
方法。
从 1.6 版开始,Class.create
接受两种类型的参数。如果第一个参数是 Class
,则该类作为新类的基类,
新类将会继承基类中所有的方法。否则,任何参数都被认为是一个对象,新类会复制参数对象中的方法作为新类的实例方法。
即使在子类中重写了基类已有的实例方法,子类的方法仍然能够访问基类的原始方法。只需要按照通常的方式定义子类需要重写的方法,
但将第一个参数设为 $super
,即可在该函数中使用 $super
调用基类被重写的方法。
译注:关于 $super
,更详细的资料请参见这里。
如果要扩展已有的类,使用 Class.addMethods 方法。
特殊属性
类自身包含了一些特殊的属性:
superclass
属性指向该类的基类(如果没有基类,则为null
)。subclasses
属性是一个数组,该数组包含了该类的所有子类(如果没有子类,则是一个空数组)。
另外,类的实例中包括了原生的 JavaScript constructor
属性,该属性指向创建该实例的类。
样例
var Animal = Class.create({
initialize: function(name, sound) {
this.name = name;
this.sound = sound;
},
speak: function() {
alert(this.name + " says: " + this.sound + "!");
}
});
// Animal 的子类
var Snake = Class.create(Animal, {
initialize: function($super, name) {
$super(name, 'hissssssssss');
}
});
var ringneck = new Snake("Ringneck");
ringneck.speak();
//-> 提示:"Ringneck says: hissssssssss!"
var rattlesnake = new Snake("Rattler");
rattlesnake.speak();
//-> 提示:"Rattler says: hissssssssss!"
// 混入 Enumerable
var AnimalPen = Class.create(Enumerable, {
initialize: function() {
var args = $A(arguments);
if (!args.all( function(arg) { return arg instanceof Animal }))
throw "Only animals in here!"
this.animals = args;
},
// 为使用 Enumerable 的方法,实现 _each
_each: function(iterator) {
return this.animals._each(iterator);
}
});
var snakePen = new AnimalPen(ringneck, rattlesnake);
snakePen.invoke('speak');
//-> 提示:"Ringneck says: hissssssssss!"
//-> 提示:"Rattler says: hissssssssss!"
1.6 之前
以下的描述仅针对 Prototype 1.6 之前的版本。
Class.create
返回一个函数,当该函数被调用时,会自动调用它自己的 initialize
方法。
这类似于 Ruby 风格的面向对象编程,同时也让你能够更容易的重写父类的构造器,以创建新的子类。
样例
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();
// -> 提示:"Ringneck says: hissssssssss!"
var Dog = Class.create();
Dog.prototype = Object.extend(new Animal(), {
initialize: function(name) {
this.name = name;
this.sound = "woof";
}
});
var fido = new Dog("Fido");
fido.speak();
// -> 提示:"Fido says: woof!"