js高级对象创建模式

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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值