繼承方式四 原型式繼承

2021-10-05 08:32:17 字數 2661 閱讀 4329

道格拉斯·克羅克福德在一篇文章中介紹了一種實現繼承的方法,這種方法並沒有使用嚴格意義上的建構函式。它的想法是借助原型可以基於已有的物件建立新物件,同時還不必因此建立自定義型別。為了達到這個目的,他給出了如下函式。

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 函式內部,先建立乙個臨時性的建構函式,然後將傳入的物件作為這個建構函式的原型,最後返回了這...