自定义JavaScript类型的一个例子
2011-10-24 20:56
363 查看
Javascript没有类的概念,ECMA-262把Javascript对象定义为“无序属性的集合,其属性可以半酣基本值、对象和函数"。我们利用把JavaScript看做是Hash对象,其中属性就是键,值可以是数据或函数。
自定义Javascript对象的最简单的办法就是创建一个Object的实例,然后为它添加属性方法。
var person=new object();
person.name=‘Jim’;
person.age=30;
person.job='IT';
person.sayName=Function(){
alert(this.name);
};
显然,这种方式会产生大量重复代码,为解决这一问题,同常可以用工厂模式。
一、工厂模式
这种模式采用了软件工程中的工厂设计模式的思想。
function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
}
return 0;
}
var person1 =createPerson('Jim',30,'IT');
var person2=createPerson('Tom',27,'Doctor');
工厂模式虽然解决了重复代码的问题,但与创建Object实例方式一样,没解决对象类型的问题。于是构造函数模式出现了。
二、构造函数模式
JavaScript中有一个很重要的概念:函数是对象,函数名实际上是一个函数对象指针。创建算自定义函数,从而添加自定义的属性方法。改前面的代码:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person('Jim',30,'IT');
var person=new Person(‘Tom’,27,'Doctor')
alert(person1 instanceof Person);//true
创建自定义函数意味着可以将函数名作为自定义对象类型,这也是构造韩式密室优越于工厂模式之处,然而这种模式也有缺点,因为函数是对象,因此自定义函数的方法也应该是对象,对象属于引用类型,因此:
<SPAN style="FONT-SIZE:12px">alert(person1.saayName == person2.sayName);//false
</SPAN>
我们在一个构造函数中两个方法去完成相同的任务,显然会带来额外开销。
三、原型模式
为了共享自定义对象的属性方法,引入了原型模式,看下面的代码:
function Person(){
}
Person.prototype={
constructor:Person,
name:'Jim',
age:30,
job:'IT',
friends:['Kite'],
sayName:function(){
alert(this.name);
}
};
var person1=new Person();
person1.sayName(); //Jim
var person2=new Person();
person2.name=‘Tom';
person2.sayName();
person1.friends.push('Mike');
alert(person1.friends); //Kite,Mike
alert(person2.friends);//Kite,Mike
alert(person1.friends === person2.friends); //true
原型模式是所有的属性方法都是共享,与其它语言中的静态类相似,虽然解决了原型模式中对象方法的重复使用问题,但如果属性是引用类型就有问题了。Person.prototype对象中有一个名位friends属性,该属性包含一个字符串数组。
然后新建了两个Person实例,接着向person1.friends属性引用的数组新增了一个字符串,由于friends数组存在于Person.prototype而非person1中,所以对person1的修改也会在person2中反映出来。因为实际应用中很少单独用这种方法。
四、构造函数/原型混合模式
创建自定义JavaScript类型的最常见方式就是构造函数/原型混合模式,构造函数定义非共享的属性,原型模式用来定义和共享的属性。取两者之长,发挥各自优势。下面重写了前面的代码:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=['Kite'];
}
Person,prototype={
construvtor:Person,
sayName:function(){
alert(this.name);
}
};
var person1=new Person('Jim',30,'IT');
var person2=new Person('Tom',27,'Doctor');
person1.friends.push('Mike');
alert(person1.friends); //Kite,Mike
alert(person2.friends); //Kite
alert(person1.friends ===person2.fridends); //false
alert(person1.sayName ===person2.sayName); //true
这种混合模式目前也是ECMAScript中使用最广、认同度最高的自定义JavaScript类型的方法。
转自 http://www.riafan.com/article/ajax/customize-type-with-javascript.html
自定义Javascript对象的最简单的办法就是创建一个Object的实例,然后为它添加属性方法。
var person=new object();
person.name=‘Jim’;
person.age=30;
person.job='IT';
person.sayName=Function(){
alert(this.name);
};
显然,这种方式会产生大量重复代码,为解决这一问题,同常可以用工厂模式。
一、工厂模式
这种模式采用了软件工程中的工厂设计模式的思想。
function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
}
return 0;
}
var person1 =createPerson('Jim',30,'IT');
var person2=createPerson('Tom',27,'Doctor');
工厂模式虽然解决了重复代码的问题,但与创建Object实例方式一样,没解决对象类型的问题。于是构造函数模式出现了。
二、构造函数模式
JavaScript中有一个很重要的概念:函数是对象,函数名实际上是一个函数对象指针。创建算自定义函数,从而添加自定义的属性方法。改前面的代码:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person('Jim',30,'IT');
var person=new Person(‘Tom’,27,'Doctor')
alert(person1 instanceof Person);//true
创建自定义函数意味着可以将函数名作为自定义对象类型,这也是构造韩式密室优越于工厂模式之处,然而这种模式也有缺点,因为函数是对象,因此自定义函数的方法也应该是对象,对象属于引用类型,因此:
<SPAN style="FONT-SIZE:12px">alert(person1.saayName == person2.sayName);//false
</SPAN>
我们在一个构造函数中两个方法去完成相同的任务,显然会带来额外开销。
三、原型模式
为了共享自定义对象的属性方法,引入了原型模式,看下面的代码:
function Person(){
}
Person.prototype={
constructor:Person,
name:'Jim',
age:30,
job:'IT',
friends:['Kite'],
sayName:function(){
alert(this.name);
}
};
var person1=new Person();
person1.sayName(); //Jim
var person2=new Person();
person2.name=‘Tom';
person2.sayName();
person1.friends.push('Mike');
alert(person1.friends); //Kite,Mike
alert(person2.friends);//Kite,Mike
alert(person1.friends === person2.friends); //true
原型模式是所有的属性方法都是共享,与其它语言中的静态类相似,虽然解决了原型模式中对象方法的重复使用问题,但如果属性是引用类型就有问题了。Person.prototype对象中有一个名位friends属性,该属性包含一个字符串数组。
然后新建了两个Person实例,接着向person1.friends属性引用的数组新增了一个字符串,由于friends数组存在于Person.prototype而非person1中,所以对person1的修改也会在person2中反映出来。因为实际应用中很少单独用这种方法。
四、构造函数/原型混合模式
创建自定义JavaScript类型的最常见方式就是构造函数/原型混合模式,构造函数定义非共享的属性,原型模式用来定义和共享的属性。取两者之长,发挥各自优势。下面重写了前面的代码:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=['Kite'];
}
Person,prototype={
construvtor:Person,
sayName:function(){
alert(this.name);
}
};
var person1=new Person('Jim',30,'IT');
var person2=new Person('Tom',27,'Doctor');
person1.friends.push('Mike');
alert(person1.friends); //Kite,Mike
alert(person2.friends); //Kite
alert(person1.friends ===person2.fridends); //false
alert(person1.sayName ===person2.sayName); //true
这种混合模式目前也是ECMAScript中使用最广、认同度最高的自定义JavaScript类型的方法。
转自 http://www.riafan.com/article/ajax/customize-type-with-javascript.html
相关文章推荐
- 一个基于MBProgressHUD的自定义视图hud例子
- JavaScript中如何判断一个值的类型
- 在Orchard中创建一个自定义字段类型
- javascript事件小例子(利用ActiveX对象创建一个进度条)
- PostgreSQL自定义函数返回单条记录类型的例子...
- 4-4 求自定类型元素的平均 (10分) 本题要求实现一个函数,求N个集合元素S[]的平均值,其中集合元素的类型为自定义的ElementType。 函数接口定义: ElementType Aver
- QT 自定义消息(超级简单的一个例子)
- javascript判断变量类型的自定义函数
- Javascript一个在页面内追加元素的小例子
- 活生生的例子:qInstallMessageHandler接受指定类型的函数指针,这样就可以随心所欲的让程序员自定义函数名以及函数位置
- 分享一个帮助你自定义标签并且兼容现代浏览器的javascript类库 : X-tag
- jquery的优点和一个简单的jquery和javascript的对比例子
- hibernate中映射blob数据类型的一个例子
- JavaScript 对象概念以及自定义引用类型
- 【JavaScript】通过一个例子认识prototype,constructor和instanceof
- 中级JavaScript例子, 如何实现一个简单实用的模板套用机制, GXTemplate , 第一章(估计要写9章)
- JavaScript——扩展Date对象,自定义一个dateDiff函数
- SVM 自定义kernel的一个简单的code 例子
- javascript实现的一个自定义长度的文本自动换行的函数。
- 三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子