道格拉斯·克羅克福德在一篇文章中介紹了一種實現繼承的方法,這種方法並沒有使用嚴格意義上的建構函式。它的想法是借助原型可以基於已有的物件建立新物件,同時還不必因此建立自定義型別。為了達到這個目的,他給出了如下函式。
function
object
(o)f
.prototype = o;
return
newf()
;}
在object()函式內部,先建立了乙個臨時性的建構函式,然後將傳入的物件作為這個建構函式的原型,最後返回了這個臨時型別的乙個新例項。從本質上講,object()對傳入其中的物件執行了一次淺複製。來看下面的例子:
function
object
(o)f
.prototype = o;
return
newf()
;}var person =
;var anotherperson =
object
(person)
;anotherperson.name =
"陶淵明"
;anotherperson.friends.
push
("李清照");
var yetanotherperson =
object
(person)
;yetanotherperson.name =
"曹操"
;yetanotherperson.friends.
push
("陸游");
console.
log(person.friends)
;//["杜甫", "杜牧", "李清照", "陸游"]
克羅克福德主張的這種原型式繼承,要求你必須有乙個物件可以作為另乙個物件的基礎。如果有這麼乙個物件的話,可以把它傳遞給object()函式,然後再根據具體需求對得到的物件加以修改即可。在這個例子中,可以作為另乙個物件基礎的是person物件,於是我們把它傳入到object()函式中,然後該函式就會返回乙個新物件。新物件將person作為原型,所以它的原型中就包含乙個基本型別值屬性和乙個引用型別值屬性。這意味著person.friends不僅僅屬於person所有,而且也會被anotherperson 以及yetanotherperson共享。實際上,這就相當於又建立了person物件的兩個副本。
ecmascript5通過新增object.create()方法規範化了原形式繼承。這個方法接收兩個引數:乙個用作新物件原型的物件和(可選的)乙個為新物件定義額外屬性的物件。在傳入乙個引數的情況下,object.create()和object()方法的行為相同。
function
object
(o)f
.prototype = o;
return
newf()
;}var person =
;var anotherperson = object.
create
(person)
;anotherperson.name =
"陶淵明"
;anotherperson.friends.
push
("李清照");
var yetanotherperson = object.
create
(person)
;yetanotherperson.name =
"曹操"
;yetanotherperson.friends.
push
("陸游");
console.
log(person.friends)
;//["杜甫", "杜牧", "李清照", "陸游"]
console.
log(anotherperson.friends)
;//["杜甫", "杜牧", "李清照", "陸游"]
console.
log(yetanotherperson.friends)
;//["杜甫", "杜牧", "李清照", "陸游"]
object.create()方法的第二個引數與object.defineproperties()方法的第二個引數格式相同:每個屬性都是通過自己的描述符定義的。以這種方式指定的任何屬性都會覆蓋原型物件上的同名屬性。例如:
var person =
;var anotherperson = object.
create
(person,})
;console.
log(anotherperson.name)
;//杜甫
支援object.create()方法的瀏覽器有ie9+、firefox4+、safari5+、opera 12+和chrome。
在沒有必要興師動眾地建立建構函式,而只想讓乙個物件和另乙個物件保持類似的情況下,原型式繼承是完全可以勝任的。不過別忘了,包含引用型別值的屬性始終都會共享相應的值,就像使用原型模式一樣。
原型式繼承
var person alert person.name li function create obj 建立空的建構函式 df.prototype obj 將引數物件的屬性方法賦給建構函式 return new df 返回該建構函式的例項物件 var man create person 試過直接將p...
JavaScript 繼承 原型式繼承
繼承 原型式繼承 原型式繼承並沒有使用嚴格意義上的建構函式,是通過借助原型基於已有的物件建立新物件,同時還不必建立自定義型別。使用原型式繼承的主要思路如例1所示 例1 function object o f.prototype o return new f 將例1進行分析可知 在object函式的內...
js繼承之 原型式繼承
借助原型可以基於已有的物件建立新物件,同時還不必因此常見自定義型別。為了達到這個目的,他給出了如下函式 function object o f.prototype o return new f 在object 函式內部,先建立乙個臨時性的建構函式,然後將傳入的物件作為這個建構函式的原型,最後返回了這...