日期:2014-05-16 浏览次数:20333 次
1. 原型对象的问题
??? 首先,它省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值。
??? 最大的问题,由其共享的本质所导致的。
??????? 原型中所有的属性是被很多实例共享的,这种共享对于函数非常合适。
??????? 对于那些基本值的属性也还说的过去,因为可以通过为实例添加一个同名的属性屏蔽掉原型中的属性。
??????? 但是,对于包含引用类型值的属性来说,问题就比较突出了。
function Person() {} Person.prototype = { constructor : Person, name : "answer", age : 22, job : "Software Engineer", friends : ["xhc", "jmn"], sayName : function() { alert(this.name); } } var person1 = new Person(); var person2 = new Person(); person1.friends.push("new"); alert(person1.friends); //"xhc,jmn,new" alert(person2.friends); //"xhc,jmn,new"
?一般情况下,不同的实例需要拥有各自不同的全部属性。这个问题,正式很少单独使用原型模式的原因所在。
?
2. 组合使用构造函数模式和原型模式(可作为定义引用类型的一种默认模式)
??? 创建自定义对象最常见的方式,就是组合使用构造函数模式和原型模式。
??? 构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。
??? 因此,每个实例都有各自的一份实例属性的副本,但同时又共享这对方法的引用,最大限度的节省了内存。
??? 另外这种模式还支持向构造函数传递参数。
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.friends = ["xhc", "jmn"]; } Person.prototype = { constructor : Person, sayName : function() { alert(this.name); } }
?