[笔记二]Essential JavaScript Design Patterns For Beginners

[size=large]二、 构造模式[/size]
利用prototype 来构造自己的函数。

function Car(model,year,miles){
this.model = model;
this.year = year;
this.miles = miles;
}
Car.prototype.toString = function(){
return this.model + " has done " + this.miles + " miles";
};
var civic = new Car("Honda Civic",2009,20000);
var mondeo = new Car("Ford Mondeo",2010,5000);

console.log(civic.toString());

结果:

Honda Civic has done 20000 miles


一个简单的toString()方法将在所有的Car 对象之间共用。
善用构造函数,用来简单的区分它们与其他的函数


[size=large]三、 单体模式[/size]
在传统的软件工程中,通过创建有一个方法的类来创建类的实例,实现单体模式。使用JavaScript,单体作为一个命名空间提供与全局命名空间隔离的实现代码,从而提供一个功能单一的访问点。
在JS中最简单的一种形式就是——一个对象直接量与它相关的方法和属性。如下:

var mySingeton = {
prototype1: "something",
prototype2: "something else",
method1: function(){
console.log('hello world');
}
}

如果你想进一步的扩展,你可以通过封闭变量和函数增加自己的私有成员和方法。只暴露那些你想公有的部分。例如:

var mySingleton = function(){
/**
* here are my private variables and method
* */
var privateVariable = "something private";
function showPrivate(){
console.log(privateVariable);
}
/**
* public variables and methods (which can access private variables and methods)
* */
return {
publicMethod: function(){
showPrivate();
},
publicVar:"the public can see this!"
}
}
var single = mySingleton();
single.publicMethod();
console.log(single.publicVar);

结果:

something private
the public can see this!

上面的代码不错了。但是让我们进一步来考虑,如果你只想在当它需要的时候才实例化它这种情况。为了节约资源,你可以把实例化的代码放在另外一个构造函数中,如下:

var Singleton = (function(){
var instantiated;
function init(){
/*singleton code here*/
return{
publicMethod: function(){
console.log('hello world')
},
publicProperty:'test'
}
}
return {
getInstance: function(){
if(!instantiated){
instantiated = init();
}
return instantiated;
}

}
})()
/*calling public methods is then as easy as:*/
Singleton.getInstance().publicMethod();

结果:

hello world

在实践中,单体模式有什么用处吗?当需要一个对象来协调整个系统的时候,单体是很有用的。最后一个关于单体的例子:

var SingletonTester = (function(){
function Singleton(args){
var args = args || {};
this.name = 'SingletonTester';
this.pointX = args.pointX || 6;
this.pointY = args.pointY || 10;
}
var instance;
var _static = {
name: 'SingletonTestet',
getInstance: function(args){
if(instance === undefined){
instance = new Singleton(args);
}
return instance;
}
};
return _static;
})();
var singletonTest = SingletonTester.getInstance({pointX:5});
console.log(singletonTest.pointX);

结果:

5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值