4. 组合使用构造函数模式和原型模式(Hybrid)
构造函数模式用于定义实例属性
原型模式用于定义方法和共享的属性。
function People(name, age, job){ this.name = name; this.age = age; this.job = job; this.friends = ["Court", "Ann"]; } People.prototype = { constructor: People, sayName: function(){ alert(this.name); }, sayFriends: function(){ alert(this.friends); } }; var people1 = new People("Bob", 19, "Tester"); var people2 = new People("Baby", 22, "Developer"); people1.friends.push("Alice"); people1.sayFriends(); //Court,Ann,Alice people2.sayFriends(); //Court,Ann
5.动态原型模式(Dynamic)
通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。
function People(name, age, title){ this.name = name; this.age = age; this.title = title; if(typeof sayName != "function"){ People.prototype.sayName = function(){ alert(this.name); } } } var people = new People("Bob", 22, "Developer"); people.sayName(); //Bob
6.寄生构造函数(Parasitic)
这种模式的基本思想是创建一个函数,该函数的作用是封装创建对象的代码,然后再返回新创建的对象。
function People(name, age, title){ var o = new Object(); o.name = name; o.age = age; o.title = title; o.sayName = function(){ alert(this.name); } return o; } var people = new People("Bob", 41, "Doctor");
除了使用new操作符来创建新实例,这个模式和工厂模式是一样的。
这种模式可以在特殊情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组,由于不能直接修改Array构造函数,因此可以使用这个模式。
function SpecialArray(){ var value = new Array(); value.push.apply(value, arguments); value.toPipledString = function(){ return this.join("| "); } return value; } var colors = new SpecialArray("red", "blue", "green"); alert(colors.toPipledString()); //red| blue| green
使用这种模式创建的对象 不能依赖instanceof操作符来确定其类型。
7.稳妥构造函数模式(Durable)
稳妥构造函数遵循与寄生构造函数类似的模式,有两点不同:
- 新创建对象的实例方法不引用this
- 不使用new操作符调用构造函数
function Person(name, age, title){ var o = new Object(); o.sayName = function(){ alert(name); } return o; } var person = Person("Bob", 30, "Software Engineer"); person .sayName(); //Bob
使用这种模式创建的对象 不能依赖instanceof操作符来确定其类型。