2014-10-10 32 views
1

讓我們假設我有以下目標函數:如何在javascript中擴展現有構造函數?

function A(options){ 
... 
} 

然後我想創建一個新的功能(B)繼承A的原型。 這些都是我在尋找的條件:

  • B的原型,如果修改,不應該修改的
  • 打電話給B作爲一個構造函數時
  • ,A的構造應與相應的選項調用。

乙方應是這樣的:

函數B(aOptions,bOptions){...}

var b = new B({}, {}) 
+0

Javascript [沒有](http://www.crockford.com/javascript/inheritance.html)經典的繼承機制。 – amphetamachine 2014-10-10 16:19:15

+0

許多JS問題的答案可以在MDN上找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#Inheritance – 2014-10-10 16:53:31

+0

不需要2個選項。您可以傳遞一個函數,並使函數使用或變異適用於該特定函數的任何函數。更多關於原型和將參數傳遞給一系列函數的鏈接:http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR 2014-10-11 00:27:02

回答

7

只需撥打A構造與this

function B(aOptions, bOptions) { 
    A.call(this, aOptions); 

    // do stuff with bOptions here... 
} 

現在來建立原型

B.prototype = Object.create(A.prototype, { 
    constructor: { 
    value: B 
    } 
}); 

現在B就必須從A的原型方法

任何新方法添加到B的原型將提供給A的原型


有一對夫婦其他的調整也可以讓你的生活更輕鬆。

function A(options) { 

    // make `new` optional 
    if (!(this instanceof A)) { 
    return new A(options); 
    } 

    // do stuff with options here... 
} 

,做同樣的對於B

function B(aOptions, bOptions) { 

    // make `new` optional 
    if (!(this instanceof B)) { 
    return new B(aOptions, bOptions); 
    } 

    // call parent constructor 
    A.call(this, aOptions); 

    // do stuff with bOptions here... 
} 

現在,您可以撥打A(options)new A(options)得到相同的結果。

與B相同,B(aOptions, bOptions)new B(aOptions, bOptions)也會得到相同的結果。

+0

那麼在functon b中這個值是什麼? ..假設我用var a = new a()調用函數b,那麼這點還是有點別的? – 2014-10-10 16:25:39

+0

@AvinashBabu這裏的所有代碼都不會修改A.'new A()'調用'A',而不是'B'。當你調用'new B()'時,'this'的值將指向'B'的一個實例。 – naomik 2014-10-10 16:26:56

+0

所以如果我叫var b = new b()那麼這個指向變量b對嗎? – 2014-10-10 16:29:11

相關問題