首页 > 代码库 > JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象

JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象

一、仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下:

1、它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题!

2、最大的问题是原型中的所有属性是被很多实例所共享的,这种共享对于函数非常合适,对于那些包含基本值的属性也说得过去,因为我们知道可以在实例上添加一个同名属性,可以隐藏原型中的对应属性。但是对于包含应用类型值的属性来说,问题就非常严重了,代码如下:

function Person(){}Person.prototype={    constructor:Person,    name:"张三",    age:22,    job:"coder",    friends:["李四","王五"],    sayName:function(){        alert(this.name);    }}var person1=new Person();var person2=new Person();person1.friends.push("赵六");    alert(person1.friends);  //输出:李四,王五,赵六    alert(person2.friends);//输出:李四,王五,赵六

分析上面的代码,当我们为person1添加一个朋友的时候,发现person2同时也被添加了一个朋友,但这并不是我们想要的,而这正是因为原型模式的共享的本性所导致的,只要任何一个实例修改了原型属性对象中的属性值,所有与该原型对象关联的实例都会受到影响!

JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象