转载:http://blog.sina.com.cn/s/blog_60f632050100wz7h.html
(1)基于已有对象的扩充方法:适用于临时构建对象,弊端:每次构建对象都要新建一个。
var object=new Object();
object.name="Tom";
object.sayname=function(name)
{
this.name=name;
alert(this.name);
}
object.sayname("James");
(2)工厂方法 :可以重复返回多个对象。
function createObject(){
var object=new Object();
object.username="Tom";
object.password="123";
object.get=function(){
alert(this.username+","+this.password);
}
return object;
}
var o1=createObject();
var o2=createObject();
o2.username="james";
o1.get();
o2.get();
工厂方法的改进:
因为js的函数定义是指向一个应用的对象,所以每次构建一个object对象,都会构建一个get方法的对象,现在将get方法分离,那么就是多个object对象共用一个get对象,这样就可以节省内存空间。改进如下: function get(){
alert(this.username+","+this.password);
}
function createObject(username,password){
var object=new Object();
object.username=username;
object.password=password;
object.get=get;
return object;
}
var o1=createObject();
var o2=createObject();
o1.get();
o2.get();
(3)构造方法创建对象:
<span style="white-space:pre"> </span>function getInfo(){
<span style="white-space:pre"> </span>alert(this.username+","+this.password);
<span style="white-space:pre"> </span>}
function Person(username,password){
//在执行第一行代码前,js引擎会生产一个对象。即浏览器
this.username=username;
this.password=password;
this.getInfo=getInfo;
//此处隐含了一个return object的语句。
}
//只有在使用new Person();才会有上述Person中注释出现的情况,如果不适用new语句是不会 //成功的。
var person=new Person("Tom","abc");
person.getInfo();
var person2=new Person("Jame","123");
person2.getInfo();
因为js的所有类都是继承Object,Object中有prototype属性,因此自定义的对象也有prototype属性:如下
function Person(){}
Person.prototype.username="Tom";
Person.prototype.password="1325";
Person.prototype.getInfor=function(){
alert(this.username+" , "+this.password);
}
var person=new Person();
var person2=new Person();
person.username="James";
person.getInfor();
person2.getInfor();
为了解决原型方法中对象贡献属性,可以采用构造方法+原型的方法去构建对象。把属性用构造方法定好。具体方法就用原型设置。
如下:
<script type="text/javascript">
function Person(password){
this.username=new Array();
this.password=password;
}
Person.prototype.getInfo=function(){
alert(this.username+","+this.password);
}
var p1=new Person("abc");
p1.username.push("Tom");
p1.getInfo();
</script>
(5)动态原型的方法:
function Person(username,password){
this.username=username;
this.password=password;
if( typeof Person.first=="undefined" ){//通过设置标志量让getInfo只生成一次对象。
alert("invoke");
Person.prototype.getInfo=function(){
alert(this.username+" , " +this.password);
}
Person.first=true;
}
}
var p1=new Person("Tom","123");
var p2=new Person("James","abc");
p1.getInfo();
p2.getInfo();