<script type="text/javascript">
function Person(name,age,height){
var Obj=new Object();
Obj.name=name;
Obj.age=age;
Obj.height=height;
Obj.sayName=function(){
alert("我的名字是:"+Obj.name);
}
Obj.run=function(){
alert("我会跑");
}
Obj.fly=function(){
alert("我会飞");
}
......
//可以写无数个,单一的要一个加一个,但是没有区分不同对象实例的不同属性和方法,其实就是普通函数里面包了一个Object,要加什么不断往下堆积
return Obj;
}
var person=Person("小明",18,175);//
person.sayName();//我的名字是小明,其他方法调用类似;
</script>
弊端:虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的类型);2、构造函数模式
<script type="text/javascript">
function(name,age,height){
this.name=name;
this.age=age;
this.height=height;
this.sayName=function(){
alert("我的名字是:"+Obj.name);
}
this.run=function(){
alert("我会跑");
}
this.fly=function(){
alert("我会飞");
}
......
//可以写无数个,依然没有区分不同对象实例的不同属性和方法,只是将所有属性方法交给了this,不用显式创建Object对象,
}
var person=new Person("小明",18,175);
</script>
与工厂模式相比:1、没有显式的创建对象
2、直接将属性和方法赋给了this对象
3、没有return语句
要创建Person的实例,必须使用new操作符,以这种方式调用构造函数实际上会经历4个步骤:
1、创建一个新对象
2、将构造函数的作用域赋给新对象
3、执行构造函数中的代码
4、返回新对象
缺点:
1. 每一次实例化,该对象内部函数都会被创建一遍。
2. 对象继承并需要在子类中调用父类的方法是不可能的,只可以覆盖或者使用。
优点: 每个实例的公共对象都是不同的,不会相互影响。
3、原型模式
<script type="text/javascript">
function Person(){
}
Person.prototype.name="小明";
Person.prototype.age=18;
Person.prototype.height=175;
Person.prototype.sayName=function(){
alert("我的名字是:"+this.name);
};
Person.prototype.run=function(){
alert("我会跑");
};
Person.prototype.sayName=function(){
alert("我会飞");
};
......//在写法上面感觉还不如工厂模式,但是在用法上面很有优势,但是依然不能区分不同对象实例的不同属性和方法;
var person=new Person();
person.sayName();
</script>
优点:1. 减少内存消耗,系统资源占用少,所有实例共享同一方法,不会创建多个
2. 原型对象继承时,子类在重写父类原型方法时很方便 ,可以很方便 调父类房法,再扩展。
缺点:
1. 优点1既是最大的优点,也同样带来一个严重问题,如果共享的对象是引用 对象(如array)则也会造成多个实例共享同一个array,很可能会相互影响
4、组合使用构造模式和原型模式(最优)
<script type="text/javascript">
function Person(name,age,height){
this.name=name;
this.age=age;
this.height=height;
}
Person.prototype={
constructor:Person,
sayName:function(){
alert("我的名字是"+this.name);
}
}
Person.prototype.run=function(){
alert("我会跑");
}
Person.prototype.fly=function(){
alert("我会飞");
}
.......
var person1=new Person("小明",18,175);
var person2=new Person("小红",20,170);
console.log(person1.name);//小明
console.log(person2.name);//小红
</script>
创建自定义类型的最常用的方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性,这样每个实例都有自己的一份实例属性的副本,又同时共享着对方法的引用,最大限度的节省了内存。优点如下:
①每个实例都会有自己的一份实例属性的副本,又同时共享对方法的引用,最大限度地节省了内存。
②这种混合模式还支持向构造函数传递参数。
这种方式创建对象,是目前使用最广泛,认同度最高的一种方式。甚至可以书是一种默认的模式。
