三分鐘搞定JS繼承

2021-10-23 03:18:38 字數 3329 閱讀 8624

基本思想:通過改變prototype的指向形成例項和原型之間的原型鏈

instancesub->subtype.prototype(instancesuper)->supertype.prototype-> object.prototype->null

子物件的原型是父物件的例項subtype.prototype = instancesuper;subtype.prototype=new supertype();父物件的例項上新增 constructor 屬性 指向 subtypesubtype.prototype.constructor = subtype;

改變prototype

動態修改prototype的屬性時,會影響所有已經建立和新建立的例項。

重寫prototype,即將prototype賦值為新的物件(物件字面量形式)時,不會影響已經建立的例項,會影響後序建立的例項

function

supertype()

supertype.prototype.

getsupervalue

=function()

function

subtype()

var instancesuper =

newsupertype()

; subtype.prototype = instancesuper;

//子物件的原型是父物件的例項

//supertype的例項作為 subtype的原型

subtype.prototype.constructor = subtype;

//新增 constructor 屬性 指向 subtype

//子物件的原型設定為父物件的例項後,再向子物件原型新增方法

subtype.prototype.

getsubvalue

=function()

var instancesub =

newsubtype()

;//子物件能夠繼承到父物件的方法

console.

log(instancesub.

getsupervalue()

);//true

console.

log(instancesub.

getsubvalue()

);//false

原型鏈的問題
1. 原型鏈上的屬性都是共享的,包含引用型別值(eg:陣列型別)的原型屬性會被所有例項共享,一改全改

2. 建立子型別的例項時 ,不能向父型別的建構函式中傳遞引數

3. 解決:使用建構函式解決原型鏈繼承的問題

基本思想:在子物件的建構函式內部呼叫父類的建構函式
function

subtype

(type, price)

建構函式實現繼承的問題

例項繼承自建構函式,而建構函式原型上的屬性和方法對例項物件不可見.

建構函式模式的問題:方法都在建構函式中定義,無法復用

基本思想:使用原型鏈實現對原型屬性和方法的繼承,建構函式實現對例項屬性的繼承

原型+建構函式組合繼承的問題: 呼叫兩次超類建構函式。1.建立子類原型 2. 在子類構造內部呼叫父類構造

function

supertype

(name)

supertype.prototype.

sayname

=function()

function

subtype

(name,age)

//繼承建構函式原型上的屬性和方法

subtype.prototype=

newsupertype()

;//呼叫父類建構函式

subtype.prototype.constructor=subtype;

subtype.prototype.

sayage

=function()

var sub =

newsubtype

('lily',18

);sub.color.

push

('black'

);

console.

log(sub.color)

;//["red", "green", "blue", "black"]

var sub2 =

newsubtype

('nacy',12

);console.

log(sub2.color)

;//["red", "green", "blue"]

基本思想:建立乙個生成臨時建構函式的函式,借助原型,基於已有的物件建立新物件
function

object

(o);

//建立臨時建構函式

f.prototype=o;

//將臨時建構函式的原型設定為超類的物件.

return

newf()

;//返回臨時建構函式的新例項

}var person2=

object

(person)

;//則 person2 的原型為person

原型式繼承的問題基本思想:原型式繼承+工廠模式(建立乙個僅用於封裝繼承過程的函式,該函式在內部為物件新增屬性和方法,然後返回物件)

寄生式繼承的問題:不能做到函式復用

function

object

(o);

f.prototype=o;

//將臨時建構函式的原型設定為超類的物件.

return

newf()

;}function

createanother

(original)

return clone;

}var person=

var person2=

createanother

(person)

; person2.

sayhi()

;

基本思想: 寄生式繼承+組合繼承
function

object

(o);

f.prototype=o;

//將臨時建構函式的原型設定為超類的物件.

return

newf()

;}//建立超類建構函式的副本,賦值給子型別的原型

function

inheritprototype

(subtype,supertype)

三分鐘搞定python基礎

庫的匯入和新增 在機器學習和人工智慧為主導的工業4.0時代,python猶如一股龍捲風襲捲著一切。python作為一門解釋性的物件導向的語言雖然在運算速度上有不足,但是相比於程式運算速度,程式專案開發速度更為重要,而且在在這個裝備氪金時代,運算速度的缺憾完全可以拿硬體來補,何況python還支援並行...

沉默三分鐘

網上見此真情之文,藉以自表 原文 http www.hecaitou.net p 3018 沉默三分鐘是心祭。那麼多年了,國旗終於為平民而降。那麼多天了,全民哀悼終於實現。與此同時,火炬停止傳遞,因為這不是乙個歡慶的時刻。很多年後回顧2008年,我 也許寧可它從日曆中消失。還沒有哪一年和今年一樣,才...

三分鐘搞定pandas時間資料

import pandas as pd 載入資料 detail pd.read excel meal order detail.xlsx 獲取 place order time place order time detail.loc place order time 先轉化一下 轉化為pandas預...