非建構函式的繼承

2021-09-25 16:23:58 字數 2129 閱讀 3848

比如現在有乙個物件「人」

var person =
還有乙個物件「職位」

var position =
怎麼才能讓職位去繼承人,也就是說我怎麼才能生成中國程式設計師的物件

要注意,這兩個物件都是普通物件,不是建構函式,無法使用建構函式方法重現繼承

json格式的發明人douglas crockford,提出了乙個object()函式,可以做到這一點

function object(o);

f.prototype = o;

return new f();

}

這個object()函式,其實只做一件事,就是把子物件的prototype屬性,只想物件,從而使得子物件與父物件連在一起。

使用的時候,第一步現在父物件的基礎上,生成子物件。

var position = object(person);
然後,再加上子物件本省的屬性

position.name = '程式設計師';
這時,子物件已經繼承了父物件的屬性了

alert(position.nation);//中國
除了使用prototype鏈以外,還有另一種思路:把物件的屬性,全部拷貝給子物件,也能實現繼承。

下面這個函式就是在做淺拷貝:

function extendcopy(p);

for(var i in p)

c.uber = p;

return c;

}

使用

var position = extendcopy(person);

position.name = '程式設計師';

alert(position.nation);//中國

但是,這樣的拷貝有乙個問題。那就是,如果父物件的屬性等於陣列或另乙個物件,那麼實際上,自物件獲得的只是乙個記憶體位址,而不是真正的拷貝,因此存在父物件被篡改的可能。

現在給person新增乙個省份,它的值是陣列

person.province = ['山東','北京','上海','哈爾濱'];
通過extendcopy()函式,position繼承了person。

var position = extendcopy(person);
然後,我沒讓你為position的省份新增乙個城市:

position.province.push('四川');
結果person的省份也被改了

alert(position.province);//山東,北京,上海,哈爾濱,四川

alert(person.province);//山東,北京,上海,哈爾濱,四川

所以,extendcopy()只是拷貝基本資料型別的資料,我們把這種拷貝叫做「淺拷貝」。這是最早期jquery實現繼承的方法。

所謂的深拷貝,就是能夠實現真正意義上的陣列和物件的拷貝,它的實現並不難,只要遞迴呼叫淺拷貝就行了。

function deepcopy(p.c);

for(var i in p);

deepcopy(p[i],c[i]);

}else

}return c;

}

使用

var position = deepcopy(person);
現在,給父物件加乙個屬性,值為陣列,然後再子物件修改這個屬性

person.province = ['山東','上海','北京'];

position.province.push('廈門');

這是父物件就不會受到影響了。

alert(position.province);//山東,上海,北京,廈門

alert(person.province);//山東,上海,北京

目前,jquery庫就使用的就是這種繼承方法。

js 非建構函式實現繼承 深拷貝

非建構函式的繼承 深度拷貝 var chinese for var i in p deepcopy p i c i else c i p i return c var doctor deepcopy chinese 現在,給父物件加乙個屬性,值為陣列。然後,在子物件上修改這個屬性 chinese.b...

建構函式的繼承

在父類中定義了2個建構函式,在子類中,也定義了2個建構函式。當執行子類時,可以發現先呼叫父類的建構函式,在呼叫子類的建構函式。實驗四 建構函式的繼承 實驗內容 在父類中,定義了2個建構函式,在子類中,也定義了2個建構函式。編寫 程式顯示父類 子類建構函式的呼叫過程,在子類中實現建構函式的繼承。pac...

建構函式的繼承

物件之間的 繼承 有五種方法。比如,現在有乙個 動物 物件的建構函式。function animal 還有乙個 貓 物件的建構函式。function cat name,color 怎樣才能使 貓 繼承 動物 呢?一 建構函式繫結 function cat name,color var cat1 ne...