JavaScript高手之路:构造函数方式封装对象

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript高手之路:构造函数方式封装对象相关的知识,希望对你有一定的参考价值。

本节的主要内容是讲解new Object方式创建对象以及以这种方式来封装几个有趣的类。我们先来回顾一下new Object是怎么创建对象的,再说一下啊new Object方式创建对象如何演变。

new Object创建对象的演变方式

在本系列博客的第二节的时候就讲到了如何使用new Object方式和字面量方式来创建对象,前一篇博客中用字面量方式来封装了几个也民效果的类,这这一节我们先来看看new Object这种方式创建的对象方式是如何演变的。new Object是这样定义对象的:

        var obj1 = new Object();
        obj1.name = "Spring Chang";
        obj1.QQ = "290794272";
        obj1.showInfo = function () 
            alert("name = " + this.name + ",QQ = " + this.QQ);
        
        obj1.showInfo();

上面代码直接了断的创建了obj1对象,并对它的属性name,QQ赋值,然后在showInfo方法中输出这两个属性的值。如果要创建第二个对象,则这样创建:

        var obj2 = new Object();
        obj2.name = "Lily Wang";
        obj2.QQ = "1008611";
        obj2.showInfo = function () 
            alert("name = " + this.name + ",QQ = " + this.QQ);
        
        obj2.showInfo();

这是最原始的对象创建方式,如果你的JS代码中用到一两个这样的对象不足为惧,但是如果你的代码中要用到多个对象,你会发现这样创建会比较麻烦,于是乎我们来改进一下对象的创建方式。将创建对象的过程交给一函数来执行,我们只获取该函数创建出来的对象即可,于是我们利用函数的方式来创建对象,代码如下:

        function createObject(uName, qq) 
            var obj = new Object();
            obj.username = uName;
            obj.QQ = qq;
            obj.showInfo = function () 
                alert(this.username + "," + this.QQ);
            
            return obj;
        

        var obj1 = createObject("Spring Chang", "290794272");
        obj1.showInfo();
        var obj2 = createObject("Lily Wang", "1008611");
        obj2.showInfo();

上诉代码虽然简化了对象的创建过程,但总觉得思路还是使用面向过程来完成的,我们再来改进一下,使用构造函数方法来创建对象。

        function CreateObj( uName, uQQ ) 
            this.userName = uName;
            this.userQQ = uQQ;
            this.showInfo = function () 
                alert( this.userName + '\\n' + this.userQQ );
            ;
        
        var obj1 = new CreateObj('Spring Chang', '290794272');
        obj1.showInfo();
        var obj2 = new CreateObj('Lily Wang', '1008611');
        obj2.showInfo();

当我们学会使用构造函数来创建对象的时候,让我们回过头来看看第2节JavaScript高手之路:对象的定义以及封装是怎么封装对象,这一节中我们使用字面量方式来封装对象,当时我们封装的第一个对象是四则运算,现在我们也用新的方式来封装一下四则预算。

构造方式封装四则运算

第2节我们设计的四则运算类具有=-*/运算功能,调用者只需要调用Operation.add(),Operation.sub(),Operation.muti(),Operation.divsition()就能对两数做加减成除运算,现在我们用第二种方式修改如下:

        function Oper(n1, n2) 
            this.num1 = n1;
            this.num2 = n2;
            this.add = function () 
                return this.num1 + this.num2;
            
            this.sub = function () 
                return this.num1 - this.num2;
            
            this.muti = function () 
                return this.num1 * this.num2;
            
            this.div = function () 
                return this.num1 / this.num2;
            
        

调用代码如下:

        var operation = new Oper(2, 3);
        alert(operation.add());
        alert(operation.sub());
        alert(operation.muti());
        alert(operation.div());

上面封装的类效果和第2节中封装的类效果是相同的,我就不贴出输出结果了。

构造方式封装素数

第2节中我们封装完了四则运算之后接下来封装了Primer素数类,该对象具有三个方法,分别是isPrimer()判断一个自然数是否属于素数,getPrimer()获取指定范围内的素数数组和getCount()方法获取指定范围内的素数长度,改装过后的Primer如下:

        function Primer() 
            this.primerArr = [];
            this.start = arguments[0].start;
            this.end = arguments[0].end;
            this.length = 0;

            this.isPrimer = function (number) 
                if(number <= 1) //如果该数小于等于1,则不是素数,
                    return false;
                
                for(var i = 2; i < number; i++) 
                    if(number%i == 0) 
                        return false;
                    
                
                return true;
            
            this.getPrimer = function () 
                for(var i = this.start; i <= this.end; i++) 
                    if(this.isPrimer(i)) 
                        this.primerArr.push(i);//向数组中追加元算
                    
                
                var arr = this.primerArr;
                return arr;
            
            this.getCount = function () 
                var arr = this.getPrimer();
                var length = arr.length;
                this.length = length;
                return length;
            
        

测试代码如下:

        var primer = new Primer(start:1, end:100);
        // console.log(primer.getPrimer());
        console.log(primer.getCount())
        //alert(primer.isPrimer(2));

测试代码首先创建了Primer类的对象primer,并初始化参数start:1,end:100,然后调用其isPrimer(2)判断2是否属于素数,getPrimer()获取1到100之间属于素数数组和getCount()获取素数长度。

数组排序功能

上面俩例子是对第2节中Operation和Primer的改造,现在我们再来封装另一个类数组类MyArray,该类的主要功能是:对数组进行排序和输出数组中的元素。MyArray中有一个内部变量arr记录当前数组,show()函数用于输出当前数组的每一个元素,sort()方法则用于排序。此外,由于在排序过程中多次交换数组的两个位置的值,所以添加了swap函数。
MyArray雏形如下:

        var MyArray = function (aNums) 
            this.arr = aNums;  //成员变量
            
            //输出数组元素
            this.show = function () 
            ;
            
            //排序,oder:升序、降序
            this.sort = function(order) 
            ;
            
            //交换两个数
            this.swap = function(tempArr, index1, index2) 
            
            
        

上面只是定义了MyArray的轮廓,并没有实现每个方法,下面先从最简单的输出函数实现起,show函数代码实现如下:

            //输出数组元素
            this.show = function () 
                for(var i = 0; i < this.arr.length; i++) 
                    document.write(this.arr[i] + "\\t")
                
                document.write("<br />");
            ;

代码中一个for循环遍历了arr数组的的每一个元素,没遍历一个元素留一个空格,遍历结束之后输出br标签表示换行。接下来我们来看sort函数是如何实现的:

            //排序,oder:升序、降序
            this.sort = function(order) 
                for(var i = 0; i < this.arr.length; i++) 
                    for(var j = i+1; j < this.arr.length; j++) 
                        if(order == 'desc') //如果传递过来的参数是desc,则降序排序
                            if(this.arr[i] < this.arr[j]) 
                                this.swap(this.arr, i, j);
                            
                         else  //否则升序排序
                            if(this.arr[i] > this.arr[j]) 
                                this.swap(this.arr, i, j);
                            
                        
                    
                
            ;

sort方法是用的核心就是冒泡排序,与教科书不能的是这里添加了order参数,该参数用来标志排序是升序还是降序排序,当给定的参数是"desc"时,则为降序排序,当给定参数为"asc"或者不给的时候,则默认是升序排序。
MyArray类完整代码如下:

        var MyArray = function (aNums) 
            this.arr = aNums;  //成员变量

            //输出数组元素
            this.show = function () 
                for(var i = 0; i < this.arr.length; i++) 
                    document.write(this.arr[i] + "\\t")
                
                document.write("<br />");
            ;
            //排序,oder:升序、降序
            this.sort = function(order) 
                for(var i = 0; i < this.arr.length; i++) 
                    for(var j = i+1; j < this.arr.length; j++) 
                        if(order == 'desc') //如果传递过来的参数是desc,则降序排序
                            if(this.arr[i] < this.arr[j]) 
                                this.swap(this.arr, i, j);
                            
                         else  //否则升序排序
                            if(this.arr[i] > this.arr[j]) 
                                this.swap(this.arr, i, j);
                            
                        
                    
                
            ;
            //交换两个数
            this.swap = function(tempArr, index1, index2) 
                var temp = tempArr[index1];
                tempArr[index1] = tempArr[index2];
                tempArr[index2] = temp;
            
        

测试用例如下:

        var myArr = new MyArray([1,0,0,8,6]);
        document.write("排序前:")
        myArr.show();

        myArr.sort();
        document.write("缺省参数排序,排序后:");
        myArr.show();

        myArr.sort("desc");
        document.write("降序排序,排序后:");
        myArr.show();

测试用例输出结果如下:

以上是关于JavaScript高手之路:构造函数方式封装对象的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高手之路:全选不选反选效果

JavaScript高手之路:对象的定义以及封装

JavaScript高手之路:封装css方法和Table表格

[js高手之路]构造函数的基本特性与优缺点

JavaScript高手之路:封装抽奖效果

JavaScript高手之路:封装抽奖效果