讓我們假設我有以下目標函數:如何在javascript中擴展現有構造函數?
function A(options){
...
}
然後我想創建一個新的功能(B)繼承A的原型。 這些都是我在尋找的條件:
- B的原型,如果修改,不應該修改的 打電話給B作爲一個構造函數時
- ,A的構造應與相應的選項調用。
乙方應是這樣的:
函數B(aOptions,bOptions){...}
var b = new B({}, {})
讓我們假設我有以下目標函數:如何在javascript中擴展現有構造函數?
function A(options){
...
}
然後我想創建一個新的功能(B)繼承A的原型。 這些都是我在尋找的條件:
乙方應是這樣的:
函數B(aOptions,bOptions){...}
var b = new B({}, {})
只需撥打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)
也會得到相同的結果。
那麼在functon b中這個值是什麼? ..假設我用var a = new a()調用函數b,那麼這點還是有點別的? – 2014-10-10 16:25:39
@AvinashBabu這裏的所有代碼都不會修改A.'new A()'調用'A',而不是'B'。當你調用'new B()'時,'this'的值將指向'B'的一個實例。 – naomik 2014-10-10 16:26:56
所以如果我叫var b = new b()那麼這個指向變量b對嗎? – 2014-10-10 16:29:11
Javascript [沒有](http://www.crockford.com/javascript/inheritance.html)經典的繼承機制。 – amphetamachine 2014-10-10 16:19:15
許多JS問題的答案可以在MDN上找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#Inheritance – 2014-10-10 16:53:31
不需要2個選項。您可以傳遞一個函數,並使函數使用或變異適用於該特定函數的任何函數。更多關於原型和將參數傳遞給一系列函數的鏈接:http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR 2014-10-11 00:27:02