码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-09-07 01:34:32      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

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

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之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象

标签:

原文地址:http://www.cnblogs.com/GreenLeaves/p/5847653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!