雖然object建構函式或物件字面量都可以用來建立單個物件,但這些方式有個明顯的缺點:使用同乙個介面建立很多物件,會產生大量的重複**。為解決這個問題,人們開始使用
工廠模式的一種變體。
function函式createperson()能夠根據接受的引數來構建乙個包含所有必要資訊的person物件。可以無數次的呼叫這個函式,而每次它都會返回乙個包含三個屬性乙個方法的物件。createperson(name,age,job);
returno;}
var person1=createperson("nicholas",29,"software engineer");
var person2=createperson("grey",27,"doctor");
工廠模式雖然解決了建立多個相似物件的問題,但卻沒有解決物件識別的問題(即怎樣知道乙個物件的型別)。
function在這個例子中,person()函式取代了createperson函式。我們注意到,person()中的**除了與createperson()中相同的部分外,還存在以下不同之處:person(name,age,job)
}var person1=new person("nicholas",29,"software engineer");
var person2=new person("grey",27,"doctor");
(1):沒有顯式的建立物件;
(2):直接將屬性和方法賦給了this物件;
(3):沒有return語句
我們建立的每個函式都有乙個prototype(原型)屬性,這個屬性是乙個指標,指向乙個物件,而這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。
function雖然可以通過物件例項訪問儲存在原型中的值,但卻不能通過物件例項重寫原型中的值。如果我們在例項中新增乙個屬性,而該屬性與例項原型中的乙個屬性同名,那我們就在例項person()
person.prototype.name="nicholas";
person.prototype.age=29;
person.prototype.sayname=function
()var person1=new
person();
person1.sayname();
//"nicholas"
var person2=new
person();
person2.sayname();
//"nicholas"
alert(person1.sayname==person2.sayname); //
true
中建立該屬性,該屬性將會遮蔽原型中的屬性。
由於在原型中查詢值的過程是一次搜尋,因此我們對原型物件所做的任何個修改都能夠立即從例項上反映出來--即使先建立了例項後個性原型也照樣如此。請看下面的例子:
var friend=new以上**先建立了person的乙個例項,並將其儲存在person中,然後,下一條語句在person.prototype中新增了乙個方法sayhi().即使person例項是在新增新方法之前建立的,person();
person.prototype.sayhi=function
()friend.sayhi();
//"hi" (沒有問題!)
但它仍然可以訪問這個新方法。
儘管可以隨時為原型新增屬性和方法,並且個性能夠立即在所有物件例項中反映出來,但如果是重寫整個原型物件,那麼情況就不一樣了。我們知道,呼叫建構函式時會為例項
新增乙個指向最初原型的[[prototype]]指標,而把原型修改為另外乙個物件就等於切斷了建構函式與最初原型之間的聯絡。請記住:例項中的指標僅指向原型,而不指向構造
函式。看下面的例子:
function可以通過檢查某個應該存在的方法是否有效,來決定是否需要初始化原型。來看下面乙個例子:person()
var friend=new
person();
person.prototype=
};friend.sayname();
//error
function通常,在前述幾種模式都不適用的情況下,可以使用寄生(parasitic)建構函式模式。這種模式的基本思想是建立乙個函式,該函式的作用僅僅是封裝建立物件的**,然後再返回person(name,age,job)}}
var friend=new person("nicholas",29,"software engineer");
friend.sayname();
新建立的物件;但從表面上看,這個函式又很像是典型的建構函式。下面是乙個例子:
function在這個例子中,通過在建構函式的末尾新增乙個return語句,可以重寫呼叫建構函式時返回的值。person(name,age,job)(
var o=new
object();
o.name=name;
o.age=age;
o.job=job;
o.sayname=function
()return
o;}
var friend=new person("nicholas",29,"software engineer");
friend.sayname();
//"nicholas"
這個模式可以在特殊情況下用來為物件建立建構函式。假設我們想建立乙個具有額外方法的特殊陣列。由於不能直接修改array建構函式,因此可以使用這個模式。
functionspeicalarray()
return values; //
返回陣列
}var colors=new speicalarray("red","blue","green");
alert(colors.topipedstring());
//"red|blue|green"
JavaScript高階程式設計
ecmascript有5種基本型別資料 另外還有一種複雜的資料型別 typeof就是用來檢測變數的資料型別的,typeof可能會返回以下值 typeof操作符在檢測引用型別的值時,總是會返回object,所以用處不大。instanceof用來檢測物件型別的,返回值是 true false。例如 pe...
JavaScript高階程式設計 this
在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了 因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。所謂建構函式就是用來new物件的函式。其實嚴格來說,所有的函式都可以new乙個物件,但是有些函式的定義是為了new乙個物件...
javascript 高階程式設計 二
這裡我們直接進入主題 在js剛剛開始的時候,必須面臨乙個問題,那就是如何使的js的載入和執行不會影響web核心語言html的展示效果,和html和諧共存。在這個背景下 2 xhtml中的應用 在html中如果字串,那麼html就會認為js指令碼已經結束所以會產生乙個錯誤用一下 來替換 來替換aler...