初学JavaScript,正在读 Nicholas C. Zakas 的《JavaScript高级程序设计》,看到了创建对象,简单的对书中内容做了一下总结
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title></title> 5 </head> 6 <body> 7 <script type="text/javascript"> 8 //1.创建Object,为其添加属性方法 9 var person = new Object(); 10 person.name = "Nicholas"; 11 person.age = 29; 12 personal.job = "Software Engineer"; 13 14 personal.sayName = function () { 15 alert(this.name); 16 }; 17 18 /* 19 缺点:使用一个接口创建很多对象,会产生大量重复代码 20 */ 21 22 //2.工厂模式 23 function createPersonal(name, age, job) { 24 var o = new Object(); 25 o.name = name; 26 o.age = age; 27 o.job = job; 28 o.sayName = function () { 29 alert(this.name); 30 }; 31 return o; 32 } 33 34 /* 35 工厂模式解决了对象相似问题,却没有解决对象识别问题(怎样知道一个对象的类型) 36 */ 37 38 //3.构造函数模式 39 function Person(name, age, job) { 40 this.name = name; 41 this.age = age; 42 this.job = job; 43 this.sayName = function () { 44 alert(this.name); 45 }; 46 } 47 48 /* 49 构造函数模式没有显式的创建对象,直接将方法和属性赋给了this对象,没有return语句 50 要创建Person的新实例,必须使用new操作符,实际经历4个步骤 51 a.创建一个新对象 52 b.将构造函数的作用域赋给新对象(this指向这个新对象) 53 c.执行构造函数,为新对象添加属性 54 d.返回新对象 55 构造函数模式创建的对象可以识别其类型,但每个方法都要在每个实例上重建一遍 56 */ 57 58 //创建两个实例,创建两个相同的方法没必要,可以把函数定义转到方法外部 59 function Person(name, age, job) { 60 this.name = name; 61 this.age = age; 62 this.job = job; 63 this.sayName = sayName; 64 } 65 66 function sayName() { 67 alert(this.name); 68 } 69 70 /* 71 这样解决了两个方法做同一件事的的问题,但在全局作用域上定义的函数只能被某个对象调用,如果对象定义需要很多方,就要定义很多全局函数,自定义的引用类型就没有封装 性了 72 */ 73 74 //4.原型模式 75 function Person() { 76 } 77 78 Person.prototype.name = "Nocholas"; 79 Person.prototype.age = 29; 80 Person.prototype.job = "Software Engineer"; 81 Person.prototype.sayName = function () { 82 alert(this.name); 83 } 84 85 /* 86 原型模式所有参数默认取得相同的值,属性若为引用类型,多个实例之间互相影响 87 */ 88 89 //5.构造函数原型混合模式 90 function Person(name, age, job) { 91 this.name = name; 92 this.age = age; 93 this.job = job; 94 } 95 96 Person.prototype.sayName = function () { 97 alert(this.name); 98 } 99 100 /*101 构造函数用于定义实例属性,原型用于定义方法和共享属性,。eigenvalue实例都会有一份自己实例属性的副本, |