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,Nancy
alert(person2.friends);//Tom,Jerry
alert(person1.sayName == person2.sayName);//true
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值