var Obj={ name:'Hello', me:function() { alert(this.name); } } Obj.me(); Obj.name="xxd"; Obj.me(); function speak(line) { alert("speak:"+this.name+","+line); } /**Function.proprety.apply函數有兩個參數,第一個是this,第二個是arguments**/ speak.apply(null,["sxxx"]); /**也有個call函數,只是第二個參數不是數組**/ speak.call(null,"sxxx"); /**構造函數方式建立對象**/ /**習慣上構造函數的首字母要大寫,以便區別於通常函數**/ function Rabbit(adjective) { this.adjective = adjective; this.speak = function(line) { alert("speak:"+this.adjective); } } var killerRabbit = new Rabbit("killer"); killerRabbit.speak("GXXX"); /**其實也能夠這樣**/ function makeRabbit(adjective) { return { adjective:adjective, speak:function(line){/****/} }; } debugger; var blackRabbit = makeRabbit("black"); /**可是兩種方式仍是有區別的,new的方式使用了原型**/ /**killerRabbit有個屬性constructor,它指向Rabbit函數,blackRabbit也有這麼一個屬性,但它指向Object函數**/ /**輸入{}至關於new Object()**/ /**定義的每個函數都會自動獲取一個prototype屬性,該屬性擁有一個對象---該函數的原型**/ /**該原型有一個constructor屬性,反指向其當前所屬的函數 **/ /**雖然對象俗話能夠共享其原型對象的屬性,可是這種共享是單向。所以,原型的屬性影響對象,改變對象卻永遠不會影響到原型**/ /**準確的規則:查詢一個屬性值的時候,首先查詢對象自身的全部屬性,若是沒有則查找該對象的原型,若是再沒有就查找原型的原型,一次類推**/ /**所以,能夠重載屬性。如:**/ Rabbit.prototype.teeth = "why";//這是原型上的屬性 alert(killerRabbit.teeth); Rabbit.teeth = "that";//不起做用 alert(killerRabbit.teeth); killerRabbit.teeth = "this is true"; alert(killerRabbit.teeth);