<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>面向对象</title> </head> <body> 一:建立对象 1.Object构造函数或对象字面量建立单个对象 2.工厂模式:(用函数来封装特定接口建立对象的细节) 3.构造函数: 4.原型模式: 5.组合模式(最经常使用*) 6.动态原型模式 7.寄生构造函数模式 </body> <script type="text/javascript"> // 工厂模式 function createPerson(name,age,job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = createPerson("leo",29,"doctor"); var person2 = createPerson("jack",28,'teacher'); // 缺点:函数createPerson()可以建立根据接受的参数来构建一个包含全部必要信息的 Person对象。 //能够无数次的调用这个函数,而每次他都会返回三个属性和一个方法的对象。 //工厂模式虽然解决了建立多个相同对象的问题,但却没有解决对象识别的问题!!!(不懂什么意思) // 构造函数模式 function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person("leo",29,"doctor"); var person2 = new Person("jack",28,'teacher'); // 优势:建立自定义构造函数意味着未来咱们能够将他的实例标识为一种特定的类型, //而这正是构造函数模式赛过工厂模式的地方 // 缺点:就是每一个方法都要在每一个实例上建立一遍,在前面的例子中person1,person2都有一个一样的sayName方法,等于建立了两次相同的sayName方法 //原型模式 function Person(){ } Person.prototype.name = 'leo'; Person.prototype.age = 29; Person.prototype.job = 'doctor'; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); person1.sayName(); // leo var person2 = new Person(); person2.sayName(); // leo alert(person1.sayName == person2.sayName); //true // 优势:能够让全部的对象实例共享它所包含的全部属性和方法, //换句话说没必要在构造函数中定义对象实例的信息,而是能够将这些信息直接添加到原型对象中 // 缺点:省略掉了为构造函数传递初始化参数的步骤,使得全部实例在默认状况下都取得相同的属性值 // 属性共享 // 组合模式 // 使用构造函数模式和原型模式,构造函数定义实例属性,原型定义方法和共享属性 function Person(name,age,job){ this.name = name; this.age = age; this.job = job; } Person.prototype = { constructor:Person, // 对象字面量形式会使constructor属性重写,因此要从新赋值 sayName:function(){ alert(this.name); } } </script> </html>