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
相关文章推荐
- js创建对象的模式介绍
- JavaScript高级程序设计之面向对象的程序设计之创建对象之工厂模式第6.2.1讲笔记
- 浅谈 JS 创建对象的 8 种模式
- JS高级程序设计--读书笔记(js对象创建)
- 在JS中组合使用构造函数模式和原型模式创建对象
- 浅谈 JS 创建对象的 8 种模式
- 【JS】JavaScript中对象的创建与原型模式
- js创建对象的几种模式
- js 创建对象的三种方式——工厂模式、构造函数模式、原型模式
- JS创建对象的模式介绍
- 浅谈 JS 创建对象的 8 种模式
- JavaScript高级程序设计之面向对象的程序设计之创建对象之原型模式 第6.2.3讲笔记
- 浅谈 JS 创建对象的 8 种模式
- js中组合使用构造函数模式和原型模式创建对象
- JS面向对象程序设计之创建对象模式
- JavaScript高级程序设计之面向对象的程序设计之创建对象之寄生构造函数模式 第6.2.6讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之稳妥构造函数模式 第6.2.7讲笔记
- JS中使用动态原型模式、寄生构造函数模式、稳妥构造函数模式创建对象
- 浅谈 JS 创建对象的 8 种模式
- js创建对象之设计模式