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高级对象创建模式
最新推荐文章于 2022-09-12 21:08:30 发布