Class.create - Prototype JavaScript 框架

Xunxin Prototype API

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!"