javaScript 创建对象

js创建对象有几种方法:

1: 工厂方式:如:

  function createPerson(name,age){

    var templete = new Object();

    templete.name = name;

    templete.age = age;

    templete.showName = function(){

      alert(this.name);

    }

    return templete;

  }

  或者将showName定义在函数的外边,

  var p1 = createPerson();此种方式不合大众口味,因为,(1)不像其它面向对象构造语言一样使用new关键字来创建一个对象;(2)每次调用createPerson函数创建一个对象的时候,都会创建一次showName函数,这样每个对象都有独自的showName版本。当然如果将showName函数定义在createPerson外部,则不存在此问题。

2、构造函数方式

   例子:funciton Person(name,age){

        this.name = name;

        this.age = age;

        this.showName = function(){

          alert(this.name);  

        }

      }

    此种方式仍然会在每次创建一个对象的时候都创建一个showName方法,每个对象有独自的showName版本。

  3、原型方式

    例子:

    function Person(name,age){

    }

    Person.prototype.name = name;

    Person.prototype.age = age;

    Person.prototype.showName = function(){

      alert(this.name);

    }

        var  p = new Person("a",1);

        var p1 = new Person("b",2);

        p.showName();   //结果是“b”;

        p1.showName(); //结果是“b”;

    这种方式可以解决掉上述第二个问题,所有用new关键字创建出来的对象公用一个showName()方法,但是构造函数的prototype属性中的内容是所有对象共享的,

    所以一个对象中的内容更改会影响到所有的对象,显然不符合面向对象语言的特征。

  4、构造函数/原型模式混合;

    例子:function Person(name,age){

         this.name = name;

         this.age = age;

       }

       Person.prototype.showName = function(){

         alert(this.name);

       }

      这种方式可以显然可以解决掉上述问题,为目前大多数程序员所使用的方式。也可以使用如下方式:

      function Person(name,age){

        this.name  = name;

        this.age = age;

        if(typeOf Person._initialized == "undefined"){

           Person.prototype.showName = function (){

              alert(this.name);

           }

        }

        Person._initialized = true;

      }

      var p = new Person();

      这样将方法定义在内部,看起来更像一个面向对象的语言了。其中使用typeOf Person._initialized属性来判断是否给原型赋予了方法,确保方法只创建一次,所有对象公用一个方法。

posted @ 2013-05-03 18:24  依伦  阅读(121)  评论(0)    收藏  举报