参考资料依旧《JavaScript高级程序设计》,不得不说这本书写的太好了,讲的极为清晰凝练,好书!
先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要:
1.实例的指针仅指向原型,而不指向构造函数。
可以随时为原型添加属性和方法,并且修改能够立刻在所有对象实例中表现出来,但如果重写整个原型对象,那么情况就不一样了。调用构造函数是会为实例添加一个指向最初原型的_proto_指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
2.我们不推荐在产品化的程序中修改原生对象的原型。
3.创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式。构造函数模式用来定义实例属性,而原型模式用来定义方法和共享属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存(因为函数也是对象)。另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长。
下面的代码给出了四种构建方法的demo(寄生虫模式和稳妥模式未录入)
1.工厂模式
2.构造函数
3.对象原型
4.构造函数和对象原型组合模式
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <script language="JavaScript"> 9 // 初试对象 10 // var person = new Object(); 11 // person.name = "Nicholas"; 12 // person.age = 29; 13 // person.job = "Software Engineer"; 14 // 15 // person.sayName = function(){ 16 // alert(this.name); 17 // }; 18 // 19 // person.sayName(); 20 21 // 工厂模式 22 // function createPerson(name,age,job){ 23 // var o = new Object(); 24 // o.name = name; 25 // o.age = age; 26 // o.job = job; 27 // o.sayName = function(){ 28 // alert(this.name); 29 // }; 30 // return o; 31 // } 32 // 33 // var person1=createPerson("Nicholas",29,"Softwar Enginner"); 34 // var person2=createPerson("Greg",27,"Doctor"); 35 // person1.sayName(); 36 // person2.sayName(); 37 38 // 构造函数模式 39 // 由于工厂模式,可以讲实例表示为一种特定的类型 40 // function Person(name,age,job) {//按照惯例应大写构造函数的首字母,当然,小写也可以运行 41 // this.name = name; 42 // this.age = age; 43 // this.job = job; 44 // this.sayName = function(){//sayName后面为什么不加括号? 45 // alert(this.name); 46 // }; 47 // } 48 // var person1 = new Person("Nicholas",29,"Software Enginner"); 49 // var person2 = new Person("Geeg",27,"Doctor"); 50 // 51 // person1.sayName(); 52 // person2.sayName(); 53 // alert(person1 instanceof Person); 54 // alert(person2 instanceof Person); 55 // alert(person1 instanceof Object); 56 // alert(person2 instanceof Object); 57 // Person("zhouge",21,"Studet"); 58 // window.sayName(); 59 // var o = new Object(); 60 // Person.call(o,"xiaoli",55,"singer"); 61 // o.sayName(); 62 // 组合使用构造函数模式和原型模式 63 function Person(name,age,job){ 64 this.name=name; 65 this.age=age; 66 this.job=job; 67 this.friends=["Shelby","Court"]; 68 } 69 70 Person.prototype={ 71 constructor:Person, 72 sayName:function(){ 73 alert(this.name); 74 } 75 } 76 77 var person1=new Person("li",22,"SE"); 78 var person2=new Person("zhang",23,"CS"); 79 person1.friends.push("Van"); 80 alert(person1.friends); 81 alert(person2.friends); 82 alert(person1.friends=== person2.friends); 83 alert(person1.sayName === person2.sayName); 84 </script> 85 </body> 86 </html>