两耳不闻窗外事,一心只读圣贤书

愚昧的编程狂热分子……

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

对象的创建

不管你有没有理解对象,都必须知道对象创建的方式。

JavaScript的自定义对象包含属性(Properties)以及方法(Methods),其创建方式繁多,以下举例可能已过时(但仍可用)、或已经被网上说烂的。这里仅仅是拿出笔者的个人理解。这里必须区分“对象的创建”和“对象的声明”两个术语。前者是建楼,后者是买楼。

 

1、 构参式(又称:构造函数式)

 

为了方便理解,我称这个对象创建的方式为“构造参数式”,网上均成为“构造函数式”。以下雷同,便不一一累述了。

构造参数式的创建方法雷同于一般面向对象语言(C#)的创建方法,采用对号入座的声明方式。这种方法优点在于参数严谨,明确的告诉调用者,stu_Num是用学号,stu_Name是姓名。哪怕对象声明时,输入的参数个数不受对象创建时的参数个数影响。这句话对初学来说比较难理解,这是JavaScript的灵活性。简单举例:Student参数有3个,但不代表你声明student所输入的参数一定是3个。详情可查看示例,以及接下来所提到的无参数式

 

适合:参数固定,参数明确的对象。我提出我的征婚标准,如果征婚者不符合,极可能出错或出现预料不到的结果。

 

示例Code1

            function Student(stu_Num,stu_Name,stu_Age)

            {

                this._number = stu_Num;

                this._name = stu_Name;

                this._age = stu_Age;

                this._display = function()

                {

                    return "学号:" + this._number + ""n姓名:" + this._name + ""n年龄:" + this._age;

                };

            };

            var student1 = new Student(1,"张三",19);/* 结果:正常 */

            alert(student1._display());

            var student2 = new Student("张三",19);/* 结果:学号变了张三,年龄成了undefined */

            alert(student2._display());

       

 

2、 无参式

 

无参数式的格式便是在创建对象时,直接以“()”结尾,基于Arguments对象。优点在于极为灵活(便于重载),缺点也是显而易见的。如果不了解方法的意义,就可能无法良好的控制你输入的部分参数代表了什么意义。比如前面的Student示例便不适合用无参数式创建。笔者不打算就此深入,Arguments将会在后续文章专门讲述。

 

适合:一系列参数。征婚标准:是人便要。

 

示例Code2

 

            function Arg()

            {

                this.result = 0;

                switch(arguments.length)

                {

                    case 0:

                        break;

                    default:

                        //for(var i in arguments) 读者可以尝试以下注释代码。

                        //alert(arguments.propertyIsEnumerable)//非可枚举对象arguments != Array。

                        for(var i = 0; i < arguments.length ; i++)

                        {

                            this.result += arguments[i] * arguments[i];

                        }

                        break;

                      

                }

            }

            var arg =new Arg(5,10,15,20);

            alert(arg.result);

 

3、 初始式

这是一个极为简便的声明方式。无需创建对象,而是把对象把当“属性”在用。缺点在于属于快餐式。一次性使用。

 

适合:寿命短或把对象当参数。征婚标准:闪电结婚闪电离婚。

 

            var xx =

            {

                x:18,

                y:17,

                getSum:function()

                {

                    return this.x +this.y;

                },

                getProduct:function()

                {

                    return this.x * this.y;

                }

            };

            function css()

            {

                if(typeof arguments[0] == "object")

                {

                    var elem = document.getElementById("test1");

                    var st = arguments[0];

                    for(var i in st)

                    {

                        elem.style[i] = st[i];

                    }

                }

            }

            alert(xx.getSum());

            alert(xx.getProduct());

            css({"backgroundColor":"red","display":"block"});/* 你可以理解jQuery是如何对CSS进行操作的 */

 

4、 工厂式

 

工厂式返回一个定义的对象。优点在于可以动态返回。

 

适合:动态切换对象。征婚标准:一夫N妻。

 

            var Num = 0;

            function Factory()

            {

                var objF = new Object();

                objF.name=arguments[0];

                objF.age=arguments[1];

                objF.num = Num++;

                objF.diplay = function() //如果存在多个创建,建议将dipaly放到外部。否则将导致资源浪费。

                {

                    return "姓名:" + this.name +

                           ""n年龄:" + this.age +

                           ""n编号:" +this.num;

                };

                return objF;

            }

            var v1 = Factory("张三",18);

            alert(v1.diplay());

            var v2 = new Factory("李四",19);

            alert(v2.diplay());

 

5、 原型式、混合式、切换式

 

优点在于提供了标准默认值。网上有说先创建后赋值。但我更赞同手动赋标准值。比如可以写:Factory.prototype.name = arguments[0]? arguments[0]:”未命名

 

适合:原型式(没有赋值),有默认值。征婚标准:有老婆了,但黄了,所以征情人。

适合:混合式,依据实际情况,给予参数。

适合:切换式,动态切换对象。(不举例,简单说明:比如根据指定参数,返回personstudent对象或teacher对象。

 

            var Num = 0;

            function Factory()

            {

                Factory.prototype.name=arguments[0];

                Factory.prototype.age=arguments[1];

                Factory.prototype.num = Num++;

                Factory.prototype.diplay = function() //如果存在多个创建,建议将dipaly放到外部。否则将导致资源浪费。

                {

                    return "姓名:" + this.name +

                           ""n年龄:" + this.age +

                           ""n编号:" +this.num;

                };

            }

            var v1 = new Factory("李四",19);

            v1.name="王五";

            alert(v1.diplay());

            alert(Factory.prototype.name);

 

posted on 2009-03-23 16:26  Aloner  阅读(356)  评论(0编辑  收藏  举报