JavaScript Object Oriented Programming - All-in-one Constructor Pattern
所有的method和property都放在consctructor中,而不使用prototype。
Declaration
function Animal(name){
this.name = name;
this.run = function(){
console.log('running '+ this.name);
}
};
var animal = new Animal('Foxie');
animal.run();
Inheritance
建立Rabbit這個建構子,並繼承Animal。
function Rabbit(name){
Animal.apply(this, arguments);
this.bounce = function(){
console.log('bouncing ' + this.name);
};
};
var rabbit = new Rabbit('Rab');
rabbit.bounce();
rabbit.run();
Overriding (polymorphism)
function Rabbit(name){
Animal.apply(this, arguments);
var parentRun = this.run; //keep parent method
this.run = function(){
console.log('bouncing ' + this.name);
parentRun.apply(this); //call parent method
};
};
var rabbit = new Rabbit('Rab');
rabbit.run(); //inherited method
Private/protected methods (encapsulation)
在建構子之內的變數和函數視為private,設定給this的視為public。
function Animal(name) {
this.name = name;
this.run = function() {
console.log('running ' + this.name);
}
}
function Rabbit(name){
Animal.call(this, 'Mr.' + name.toUpperCase());
var created = new Date(); //private
function sayHi(){ //private
console.log("I'm talking rabbit " + name);
}
this.report = function(){
sayHi.apply(this);
console.log('Created at ' + created);
};
};
var rabbit = new Rabbit('Rab');
rabbit.report();
protected method並沒有實質上的支援,可參考Private/protected methods (encapsulation)。
Summary
- 在建構子完整描述物件。
- 在目前物件呼叫父建構子後完成繼承。
- 在建構子之內的變數和函數視為private,設定給this的視為public。
- protected method並沒有實質上的支援,撰寫規則是使用底線「_」。
- 使用在this中覆寫屬性,而也會保留原先的property來重複使用。
Comparison with pseudo-classical pattern
- 在All-in-one Constructor Pattern無法使用
rabbit instanceof Animal
,因為沒有做設定prototype的動作。 - 速度較慢且需要較多記憶體。由於每一個物件都擁有自己的method,而非使用prototype共享。
- 實作private method和property,是較為安全和快速的。
References
- All-in-one constructor pattern | JavaScript Tutorial
- JavaScript Object Oriented Programming - All-in-one Constructor Pattern 筆記:持續更新中...
由於部落格搬家了,因此在新落格也放了一份,未來若有增刪會在這裡更新-JavaScript Object Oriented Programming: All-in-one Constructor Pattern。
留言