JavaScript Object Oriented Programming – All-in-one Constructor Pattern

「Factory Constructor Pattern」不使用new来宣告新对象,新对象用function call来建立,如下:

 

var animal = Animal(‘fox’);

var rabbit = Rabbit(‘rab’);

对象宣告

建构子使用function定义,并回传一个新物件。

 

function Animal(name) {

return {

run: function() {

console.log(name + ” is running!”)

}

}

};

然后我们这样使用这个建构子来建立新对象,并没有使用到new。

 

var animal = Animal(‘fox’); //fox is running

animal.run();

继承

「Rabbit」这个对象是继承「Animal」所建立的建构子,然后我们来做些变化吧。

 

function Rabbit(name) {

var rabbit = Animal(name); //make animal

 

rabbit.bounce = function() { //mutate

this.run(); //rab is running!

console.log(name + ‘ bounces to the skies! :)’); //rab bounces to the skies! 🙂

}

return rabbit //return the result

}

 

var rabbit = Rabbit(‘rab’);

rabbit.bounce()

封装:Private/protected methods

public method可以被外部呼叫,例如;this.move(),但不能被private method呼叫。private method,例如;openWings,不能参考this -因此local function在此无法参考到这个新建立的对象。(但其实我的测试结果是没有这个问题,如果有大大可以告诉我是发生什么事情的话,会非常感激的!)

 

function Bird(name) {

var speed = 100; //private property

function openWings() { //private method

console.log(‘open wings’);

};

return {

fly: function() {

openWings();

this.move();

},

move: function() {

console.log(‘move’);

}

}

};

 

var bird = Bird(‘Jack’);

bird.fly();

bird.move();

其中一个解法是使用一个local变数储存对象来回传。

 

function Bird(name) {

var speed = 100; //private property

 

function openWings() { //private method

console.log(‘open wings’);

};

 

function doFly() { //private method

openWings();

self.move();

};

 

var self ={

fly: function() {

doFly();

},

move: function() {

console.log(‘move’);

}

}

return self

};

 

var bird = Bird(‘Jack’);

bird.fly();

bird.move();

Summary

Factory Constructor Pattern不使用new来宣告新对象,新对象用function call来建立

继承:建立父对象,知后修改它即可。

区域method和method是private的,物件必须先在闭包中储存再回传,这样才能在公开的method中使用。

Comparison with All-in-one constructor

 

「Factory Constructor Pattern」和「All-in-one constructor」其实结果是相同的,只是写法上稍为有些不同,选一个你喜欢的即可。

点击这里给我发消息