对象的创建
不管你有没有理解对象,都必须知道对象创建的方式。
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]:”未命名”。
适合:原型式(没有赋值),有默认值。征婚标准:有老婆了,但黄了,所以征情人。
适合:混合式,依据实际情况,给予参数。
适合:切换式,动态切换对象。(不举例,简单说明:比如根据指定参数,返回person、student对象或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);