理解面向对象的基本模式
一般情况下 我们的创建对象的方式如下:
var person = {};
person.name = "tugenhua";
person.age = 24;
person.sayName = function(){alert(this.name);}
person.sayName();//调用方法

但是使用这个传统的模式  会有个明显的缺点 使用同一个接口创建很多对象 会产生很多重复的代码;所以我们就引来工厂模式来解决这个问题
工厂模式在很多动态语言中是创建类 但是在ECMAScript中是无法创建类的 所以程序员就开发出函数 比如工厂模式函数如下:
function person(name,age,job){
 var o = {};//创建一个对象
 o.name = name;
 o.age = age;
 o.job = job;
 o.sayName = function(){alert(this.name);}
 return o; 
}
var person1 = person("tu",24,"IT");
var person2 = person("genhua",24,"II");
person1.sayName();//tu
person.sayName()//genhua;
这上面的函数是工厂模式的基本形式 虽然工厂模式解决了多个相似的对象问题 但是未解决的是对象识别的问题(怎样知道一个对象的类型),即变量person1和变量person2调用函数person时候 返回的都是对象o. 之后我们引入构造函数来解决多个对象的识别问题 下面是构造函数的基本形式。
function Person(name,age,job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = new function(){
  alert(this.name); 
 } 
}
 var person1 = new Person("tugenhua",24,"IT"),
  person2= new Person("tutu",24,"IT");
 person1.sayName();//tugenhua
 person2.sayName();//tutu;
恩 上面的是构造函数模式 构造函数模式与工厂模式相比较 1 没有明显的创建对象 2 没有返回值 3 直接将属性和方法赋值给了this对象  优点是:创建自定义构造函数将来可以将它的实例标定为一种特定
的类型 这也是说明的了 构造函数模式胜过工厂模式 但是构造函数模式虽然很好 但是还是有缺点 每个方法都要在每个实例中创建一遍,上面的两个实例的方法并不是一样的 person1.sayName == person2.sayName;//返回是false;但是上面的代码我们可以改造下 因为我们想要两个实例的函数一样 那么我们可以把上面的sayName这个方法当作全局变量来申明,那么这两个就是引用的是同个函数了!虽然可以让不同的实例来调用同个函数 但是问题又来了 在全局作用域定于的函数实际上只能被某个对象调用。更让人无法接受的是 如果对象需要定于很多方法 那么就要定于多个全局函数 那么就缺乏封装性 这是个问题 所以我们下面可以引用javascript原型来解决上面的问题!原型就是可以让所有对象实例共享他们的属性和方法!
理解原型:
无论什么时候 只要创建了一个新函数 该函数就会产生一个原型属性对应 那么所有的原型prototype属性都会自动获得一个构造函数属性 当调用一个构造函数新实例后 该实例内部会有个指针指向该原型属性 我们要明白最重要的一点是 链接是存在于实例与构造函数原型属性之间 而并非与构造函数之间 该原型模式基本形式如下
function Person(){}
Person.prototype = {
 name : "tugenhua",
 age : 24,
 job : "IT",
 sayName : function(){alert(this.name);} 
}
var person1 = new Person();
var person2 = new Person();