javascript 面向对象分析

javascript的对象定义为“unordered collection of properties each of which contains

a primitive value, object, or function.”。从这个定义我们可以得出这样的结论,javascript中的对象就是一个类似hashtable的集合,其中的key对应着property或者function的name,value对应着具体的值。

javascript创建一个对象有以下几种方法:

 

1. 最简单的办法就是创建一个Object类型的实例(instance):

 

例如: var obj = new Object();

       obj.property1 = "abc";

       obj.property2 = "efg";

       obj.function1 = function(){};

 

或者:

       var obj = { property1: "abc", property2 : "efg", function1: function(){}};

 

2. 使用factory pattern 来创建对象:

 

例如:  function createBook(author,price,title)

        { var o = new Object();

         o.author = author;

         o.price = price;

         o.title = title;

         o.getTitle = function(){ return this.title;};

         return o;

         }

 

         var book1 = createBook("john", 34, "how to work efficent");

         var book2 = createBook("venic", 40, "find a good job");

这种方法的不足之处是无法使用对象识别的语法来判断。

 

3. 使用constructor pattern来创建对象:

 

例如: function Book(author, price, title)

       { this.author = author;

        this.price = price;

        this.title = title;

        this.getTitle = function(){ return this.title;};

       }

 

         var book1 = new Book ("john", 34, "how to work efficent");

         var book2 = new Book("venic", 40, "find a good job");

         book1 instanceof Book   true;

         book1 instanceof Object  true;

 

这种方法弥补了factory pattern的不足,可以使用instanceof 来判断对象类型;

 

这种方法的不足之处在于每一个Book类型的实例都包含一份getTitle函数,造成了冗余。在vb.net 中不会出现这种情况,vb.net中对象的函数都是共用的通过函数表。

 

    book1.getTitle == book2.getTitle  false;

 

可以采用以下的办法来解决这个问题:

 

        function Book(author, price, title)

       { this.author = author;

        this.price = price;

        this.title = title;

        this.getTitle =getTitle;

       }

 

       function getTitle()

       { return this.title; }

 

       book1.getTitle == book2.getTitle  true;

 

 这种解决办法会造成global namespace 不必要的命名引入;

 

4. 使用prototype pattern来创建对象:

 

   例如:

        function Book(){}

        Book.prototype.author = "john";

        Book.prototype.price = 44;

        Book.prototype.title = "find a good job";

        Book.getTitle = function(){ return this.title; };

 

   另一种写法:

        function Book(){}

        Book.prototype = { author: "john", price: 44, title: "find a good job", getTitle: function(){return this.title;}};

 

       book1.getTitle == book2.getTitle  true;

posted on 2012-12-23 21:30  坐井观天之井底之蛙  阅读(164)  评论(0)    收藏  举报

导航