frederick_hai 发表于 2013-1-29 08:51:16

javascript面向对象编程

在javascript中最简单的创建一个对象的方式如下:
 
var person = new Object();person.name = "海绵宝宝";person.age = 27;person.job = "software engineer";person.sayName = function(){   alert(this.name);}person.sayName(); 
 工厂模式,如下所示:
 
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 person = createPerson("Frederick",27,"software engineer");person.sayName(); 
 构造函数模式,如下所示:
 
function Person(name,age,job){      this.name = name;      this.age = age;      this.job = job;      this.sayName = function(){             alert(this.name);      }}var person1 = new Person("海绵宝宝",27,"software engineer");var person2 = new Person("Frederick","29","Manager");person1.sayName();//海绵宝宝person2.sayName();//Frederick  上面的构造函数模式有个缺点,每个方法都要在创建每个实例时重新创建一遍,如上person1和person2都有一个名为sayName()的方法,但是两个方法不是同一个Function实例。简单的改进方法如下:
 
function Person(name,age,job){   this.name = name;   this.age = age;   this.job = job;   this.sayName = sayName;}function sayName(){      alert(this.name);}var person1 = new Person("海绵宝宝",27,"software engineer");var person2 = new Person("Frederick",29,"Manager");person1.sayName();//海绵宝宝person2.sayName();//Frederick 上面改造之后我们把sayName放到了构造函数之外,在构造函数内部person1和person2通过指针引用指向了全局的sayName()方法,这样一来person1和person2就共享了全局的sayName()方法。这样做同样有缺点——多出了一个名不副实的全局函数,如果对象的方法很多就会有很多这样的全局函数,为了解决这些问题可以采用下面的原型模式。
原型模式,如下所示:
 
function Person(){}Person.prototype.name = "海绵宝宝";Person.prototype.age = 27;Person.prototype.job = "software engineer";Person.prototype.sayName = function(){   alert(this.name);}var person1 = new Person();person1.sayName();var person2 = new Person();person2.sayName(); 上面的方式显然还不够好,所有的实例都共享相同的信息,为此我们可以再改造一下。
组合使用构造函数模式和原型模式,如下所示:
 
function Person(name,age,job){      this.name = name;      this.age = age;      this.job = job;      this.friends = ['Tom','Jerry'];}Person.prototype = {    constructor: Person,    sayName: function(){          alert(this.name);    }}var person1 = new Person("海绵宝宝",27,"software engineer");var person2 = new Person("Frederick",29,"Manager");person1.friends.push("Nancy");alert(person1.friends);//Tom,Jerry,Nancyalert(person2.friends);//Tom,Jerryalert(person1.sayName == person2.sayName);//true  
页: [1]
查看完整版本: javascript面向对象编程