<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>创建自定义类型的最常用的方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性,这样每个实例都有自己的一份实例属性的副本,又同时共享着对方法的引用,最大限度的节省了内存。
优点如下:
①每个实例都会有自己的一份实例属性的副本,又同时共享对方法的引用,最大限度地节省了内存。
②这种混合模式还支持向构造函数传递参数。
这种方式创建对象,是目前使用最广泛,认同度最高的一种方式。甚至可以书是一种默认的模式。