您的位置:首页 > Web前端 > JavaScript

js高级对象创建模式

2017-04-10 11:47 344 查看

1,静态方法和属性

大多数方法和属性所关联的是类的实例,而静态成员所关联的则是类的本身.
换句话说,静态成员是在类的层次上操作,而不是在实例的层次上操作.
每个静态成员都只有一份.下面,你将会看到,静态成员是直接通过类对象访问的.
//下面是添加了静态属性和方法的Book类
var Book = (function(){
var numOfBooks = 0;
function checkIson(isbn){

}
return function (newIsbn,newTitle,newAuthor){
var isbn,title,anthor;
this.getIsbn = function(){
return isbn;
};
this.setIsbn = function(newIsbn){
if(!checkIson(newIsbn)){
throw new Error('Book:Invalid ISBN.');
}
isbn = newIsbn;
};
this.getTitle = function(){
return title;
};
this.setTitle = function(newTitle){
title = newTitle || 'No title specified';
};
this.getAuthor = function(){
return author;
};
this.setAuthor = function(newAuthor){
author = newAuthor || 'No author specified';
};
numOfBooks++;
if(numOfBooks > 50){
throw new Error('Book:Only 50 instances of Book can be' + 'created.');
}
this.setIsbn(newIsbn);
this.setTitle(newTitle);
this.setAuthor(newTitle);
}
})();

//Public static method
Book.convertToTitleCase = function(inputString){
//
};

//Public,non-privileged methods
Book.prototype = {
display:function(){
//
}
};
这里的私有成员和特权成员仍然被声明在构造器中(分别使用var和this关键字).但那个构造器却从原来
的普通函数变成了一个内嵌函数,并且被作为包含它的函数的返回值赋值给Book.这就创建了一个闭包,
你可以把静态的私有成员声明在里面.位于外层函数声明之后的一对空括号狠重要,其作用是代码一载入就立即
执行这个函数(而不是在调用Book构造函数时).这个函数的返回值是另一个函数,它被赋给Book变量,Book
因此成了一个构造函数.在实例化Book时,所调用的是这个内嵌函数.
外层那个函数只是用于创建一个可以用来存放静态私有成员的闭包.
在本例中,checkIson被设计为静态方法,原因是为Book的每个实例都生成这个方法的一个新副本毫无道理
此外还有一个静态属性numOfBooks,其作用在于跟踪Book构造器的总调用次数.
本例利用这个属性将Book实例的个数限制为不超过50个.
这些私有的静态成员可以从构造器内部访问,这意味着所有私用函数和特权函数都能访问他们.与其它方法相比,
他们有一个俄明显的有点,哪就是内存中只会存放一份.因为其中那些静态方法被声明在构造器之外,所以它们
不是特权方法,不能访问任何定义在构造器的私用属性.定义在构造器中的私用方法能够调用那些私用静态方法,
反之则不然.要判断一个私用方法是否应该被设计为静态方法,一条经验则是看它是否需要访问任何实例数据.
如果它不需要,那么将其设计为静态方法会更有效率;

创建公用的静态成员则容易的多,只需要直接将其作为构造函数这个对象的属性创建即可,前述代码中的方法
convertToTitleCase就是一例,这实际上相当于把构造器作为命名空间来使用.

2,常量

常量只不过是一些不能被修改的变量.在js中,可以通过创建只有取值器而没有赋值器的私用变量来模仿常量.
因为常量往往是在开发时候进行设置,而且不因对象实例的不同而变化,所以将其作为私有静态属性来设计是
合乎情理的,假设Class对象有一个名为UPPER_BOUND的常量,那么获取这个常量而进行的方法调用如下:
var Class = (function(){
var UPPER_BOUND = 100;

var ctor = function(constructorArgument){

};
ctor.getUPPER_BOUND = function(){
return UPPER_BOUND;
};

return ctor;
})();

console.log(Class.getUPPER_BOUND());//100

//如果需要使用许多常量,但你不想为每个常量都创建一个取值器方法,那么可以创建一个通用的取值器方法

var NewClass = (function(){
var constants = {
UPPER_BOUND :100,
LOWER_BOUND:-100
};

var ctor = function(constructorArgument){

};
ctor.getConstant = function(name){
return constants[name];
};
return ctor;

})();

console.log(NewClass.getConstant('UPPER_BOUND'));//100
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Javascript