/** obsolete syntax **/
var Person = Class.create(); //通過Class.create方法創建空類
Person.prototype = { //把方法定義到prototype中,注意,是通過initalize方法初始化類的屬性和數據
initialize: function(infor) {
this.name = infor.name;
this.sex = infor.sex;
},
say: function(message) {
return this.name + ': ' + message;
}
};
var guy = new Person('Miro'); //實例化一個新的person,叫做guy,帶着一個參數Miro
guy.say('hi');
//結果是
// -> "Miro: hi"
//prototype中的繼承方式:
var Pirate = Class.create(); //建立空類;
// inherit from Person class:
Pirate.prototype = Object.extend(new Person(), { //先實例化超類,再把超類中的方法復制到子類中去,
// redefine the speak method //注意,實際上prototype類定義機制中並沒有直接定義
say: function(message) { //類的屬性而是通過intilize方法,而且所有的方法都
return this.name + ': ' + message + ', yarr!'; //之直接定義在prototype中,所以直接用原型鏈方式
} //繼承超類的所有方法不會產生問題。
});
var john = new Pirate('Long John'); //實例化一個新的Pirate,叫做john,帶着一個參數Long John'
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
來看一下Class.create方法的實現代碼
var Class = {
create: function() {
return function() { //實際上把所有的屬性定義到intiliaze方法(實際上是一個類)中,
this.initialize.apply(this, arguments); //然后通過對象冒充方式繼承該類
}
}
}
可以從prototype的例子充分體會到通過對象冒充和原型鏈類繼承的差別,一般來說屬性需用對象冒充方式繼承,方法需用原型鏈方式繼承。