1 <script type="text/javascript"> 2 //1、结合使用构造函数模式和原型模式 3 //2、动态原型模式 4 //3、寄生构造函数模式 5 //4、稳妥构造函数模式 6 7 //创建自定义类型的常见方式就是组合使用构造函数模式和原型模式。构造函数模式用于定义是实例属性,而原型模式用于定义 8 //实例属性,而原型用于定义方法和共享的属性。结果,每个实例都会有自己的副本,但同时又共享着对方法的引用,节省内存。 9 10 function Person(name, age, job) { 11 var _self = this; 12 _self.name = name; 13 _self.age = age; 14 _self.job = job; 15 _self.friends = ["张三", "李四"]; 16 } 17 18 Person.prototype = { 19 constructor: Person, 20 sayName: function () { 21 alert(this.name); 22 } 23 } 24 25 26 var person1 = new Person("徐磊", 23, "IT"); 27 var person2 = new Person("刘德华", 55, "歌手"); 28 29 person1.friends.push("张学友"); 30 alert(person1.friends); 31 alert(person2.friends); 32 alert(person1.friends === person2.friends);//false 33 alert(person1.sayName === person2.sayName);//true 34 35 //2、动态原型模式 36 function Person(name,age,job){ 37 this.name=name; 38 this.age=age; 39 this.job=job; 40 if(typeof this.sayName !="function"){ 41 Person.prototype.sayName=function(){ 42 alert(this.name) 43 } 44 } 45 } 46 47 //3、寄生构造函数模式 48 function Person(name,age,job) { 49 var o=new Object(); 50 o.name=name; 51 o.age=age; 52 o.job=job; 53 o.sayName=function(){ 54 alert(this.name); 55 } 56 return o; 57 } 58 59 //这个模式可以在特殊情况下为对象创建构造函数。 60 function SpecialArray() { 61 var values=new Array(); 62 values.push.apply(values,arguments); 63 values.toPiedString=function(){ 64 return this.split('|'); 65 } 66 return values; 67 } 68 69 var colors=new SpecialArray("red","blue","green"); 70 colors.toPiedString();//"red|blue|green" 71 72 73 //4、稳妥构造函数模式 74 //稳妥构造函数的模式是遵循寄生构造函数的模式,但是有两点不同:1、新创建对象的实例方法不引用this;2、不使用new操作符调用构造函数 75 function Person(name,age,job) { 76 var o=new Object(); 77 //这里可以定义私有变量 78 //添加方法 79 o.sayName=function(){ 80 alert(this.name); 81 } 82 return o; 83 } 84 85 var friends=Person("xulei",23,"IT"); 86 friends.sayName();//xulei 87 88 89 </script>