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;
浙公网安备 33010602011771号