让我们假设我有以下目标函数:如何在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