1. 组合模式
组合模式是目前使用最广泛,认同度最高的一种自定义对象的模式。
组合模式是将构造函数和原型继承相组合,使实例对象既可以共享相同的方法,自身的属性又不会互相影响。
// 定制实例对象自身的属性
function Person(name) {
this.name=name;
this.friends=['for'];
}
// 定制实例对象的共享属性和方法
Person.prototype={
// 改变原型对象的同时,要改变 constructor 指向,
constructor:Person,
// 共享方法
sayName(){console.log(this.name);
}
}
var p1=new Person('forceddd');
var p2=new Person('bad');
p1.sayName();
console.log(p1.sayName===p2.sayName);//true
2. 动态原型模式
动态原型模式和组合模式非常类似,只不过它是根据是否创建了实例对象来动态的创建原型对象的共享方法的。
// 动态原型模式
function Dog() {
this.name=name;
this.friends=['for'];
if(typeof this.sayName !='function'){// 说明此时对象有了实例,并且还没有 sayname 方法
Dog.prototype.sayName=function () {console.log(this.name);
}
}
}
console.log(Dog.prototype);// 此时尚未有实例化对象 没有创建 sayname 方法
var d=new Dog();// 有了实例化对象 创建了 sayname 方法
console.log(d.sayName);//