2014-10-10 56 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

相关问题