原型模式能够解决构造函数模式的方法实例有多个副本的问题
但是同时每个实例的属性也共享了,对于引用类型的属性来说
这会导致非常严重的问题,修改一个实例的属性会导致另一个实例也修改
而且也不能接受参数
function Angle(){}; Angle.prototype.coordinate = [0,0]; var a1 = new Angle(); var a2 = new Angle(); a1.coordinate[0] = 1; console.info(a2.coordinate);//[1,0]修改a1会导致a2变更
组合构造原型模式
function Person(name, job){ this.name = name; this.job = job; } Person.prototype.getName = fucntion(){ return this.name; }; var person = new Person('linjisong','it');
结合构造函数模式和原型模式
使用构造函数模式创建属性,每个实例保存一份
使用原型模式共享方法,所有实例共享保存一份
这是目前使用最广泛的对象创建方式
动态原型模式
function Person(name, job){ this.name = name; this.job = job; if(!Person.prototype.getName){ Person.prototype.getName = fucntion(){ return this.name; }; } } var person = new Person('linjisong','it');
这种模式实际上是对于不习惯将构造函数和原型分离而引入的
在判断的时候,可以只判断其中一个属性
寄生构造函数模式
function Person(name, job){ var o = new Object(); o.name = name; o.job = job; o.getName = fucntion(){ return this.name; }; return o; } var person = new Person('linjisong','it');
工厂模式不使用new,寄生构造函数模式使用new操作符
构造函数模式不返回,寄生构造函数模式返回对象
不能使用instanceof判断类型
稳妥构造函数模式
function Person(name, job){ var o = new Object(); o.getName = fucntion(){ return name; }; return o; } var person = Person('linjisong','it');
稳妥对象:不使用this和new
稳妥构造模式类似寄生构造模式,但只能通过提供的方法访问成员
不能使用instanceof判断类型
各种创建对象的模式需要根据具体情况来看,最常用的还是对象字面量和组合构造原型方式。
4、继承
在ECMAScript中,没有接口继承,只有实现继承,这些继承主要是通过原型链来实现的。像对象创建一样,下面也通过一张表格来浏览一下一些实现继承的方法。
继承方式
示例
说明
原型链
1、通过修改子类型创建函数的原型实现继承。
2、通过原型给子类型添加新方法时,一定要在替换子类型原型之后添加,而后也不能通过对象字面量修改子类型的原型。
3、可以通过两种方法确定原型和实例之间的关系:只要实例原型链中出现过构造函数fn,都返回true
(1)instance instanceof fn
(2)fn.prototype.isPrototype(instance)
4、使用原型链继承时,创建子对象时无法传递参数。
5、引用类型的父类属性会被所有子类型实例共享从而产生问题:
修改一个子类型实例的引用类型属性会导致其它所有子类型实例相应的修改