js对象的定义方法
轉載:http://blog.sina.com.cn/s/blog_60f632050100wz7h.html
(1)基于已有對象的擴充方法:適用于臨時構建對象,弊端:每次構建對象都要新建一個。
var object=new Object();object.name="Tom";object.sayname=function(name){this.name=name;alert(this.name);}object.sayname("James");
(2)工廠方法 :可以重復返回多個對象。
function createObject(){var object=new Object();object.username="Tom";object.password="123";object.get=function(){alert(this.username+","+this.password);}return object;}var o1=createObject();var o2=createObject();o2.username="james";o1.get();o2.get();
工廠方法的改進:
因為js的函數定義是指向一個應用的對象,所以每次構建一個object對象,都會構建一個get方法的對象,現在將get方法分離,那么就是多個object對象共用一個get對象,這樣就可以節省內存空間。改進如下:function get(){alert(this.username+","+this.password); }function createObject(username,password){var object=new Object();object.username=username;object.password=password;object.get=get;return object;}var o1=createObject();var o2=createObject();o1.get();o2.get();
(3)構造方法創建對象:
<span style="white-space:pre"> </span>function getInfo(){<span style="white-space:pre"> </span>alert(this.username+","+this.password);<span style="white-space:pre"> </span>}function Person(username,password){//在執行第一行代碼前,js引擎會生產一個對象。即瀏覽器this.username=username;this.password=password;this.getInfo=getInfo;//此處隱含了一個return object的語句。}//只有在使用new Person();才會有上述Person中注釋出現的情況,如果不適用new語句是不會 //成功的。var person=new Person("Tom","abc");person.getInfo();var person2=new Person("Jame","123");person2.getInfo();
(4)原型方法:(prototype)
因為js的所有類都是繼承Object,Object中有prototype屬性,因此自定義的對象也有prototype屬性:如下
function Person(){}Person.prototype.username="Tom";Person.prototype.password="1325";Person.prototype.getInfor=function(){alert(this.username+" , "+this.password);}var person=new Person();var person2=new Person();person.username="James";person.getInfor();person2.getInfor();
這種方法的缺點就是不能傳遞參數,只能在創建后修改屬性。另外使用這種方法定義的對象都貢獻同樣的屬性,因為他們都共用了object對象中的prototype對象,所以所有的對象貢獻原型中的屬性,其中一個更改了屬性,也會反映到其他對象中去。
為了解決原型方法中對象貢獻屬性,可以采用構造方法+原型的方法去構建對象。把屬性用構造方法定好。具體方法就用原型設置。
如下:
<script type="text/javascript">function Person(password){this.username=new Array();this.password=password;}Person.prototype.getInfo=function(){alert(this.username+","+this.password);}var p1=new Person("abc");p1.username.push("Tom");p1.getInfo();</script>
(5)動態原型的方法:
function Person(username,password){this.username=username;this.password=password;if( typeof Person.first=="undefined" ){//通過設置標志量讓getInfo只生成一次對象。alert("invoke");Person.prototype.getInfo=function(){alert(this.username+" , " +this.password);}Person.first=true;}}var p1=new Person("Tom","123"); var p2=new Person("James","abc");p1.getInfo();p2.getInfo();
總結
- 上一篇: okhttp_utils的使用以及与服务
- 下一篇: 如何在使用ASPMVC4的分部视图中获取