JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
Posted Green.Leaf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript之面向对象学习五(JS原生引用类型ArrayObjectString等等)的原型对象介绍
JavaScript之面向对象学九(原型式继承和寄生式继承)
javascript--面向对象(工厂模式,构造函数,原型模式)