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--面向对象(工厂模式,构造函数,原型模式)

第一百零九节,JavaScript面向对象与原型

JavaScript提高篇之面向对象之单利模式工厂模型构造函数原型链模式

前端 之 JavaScript : JS的面向对象; 定时器; BOM