2012-07-12 95 views
0

如何在创建功能后编辑功能?如何在创建后编辑功能

function foo(a, b) { 
    this.c = a+b; 
} 

var bar = new foo(2,3); //result: {'c':5} 

//now I would like to create a new function, which is a bit different from the first 
foo2 = foo; 
foo2.d = a*b; //here I get an error: a is not defined 

bar2 = new foo2(3,4); 

不,我的意思是结果应该是这样的:

function foo2(a, b) { 
    this.c = a+b; 
    this.d = a*b; 
} 
+0

无法更改构造函数。 [这个答案](http://stackoverflow.com/a/6529410/990877)可能会帮助你。 – PPvG 2012-07-12 17:07:24

回答

1

你不能做的正是你想要的东西,但也有其他方法可以做到你想要什么。

function builder(fn, propertyName) { 
    return function() { 
    var args = arguments; 
    this[propertyName] = fn.apply(this, arguments); 
    this.change = function (otherFn, otherPropertyName) { 
     return builder(otherFn, otherPropertyName || propertyName); 
    } 
    } 
} 

var Foo = builder(function (a, b) { return a + b; }, "c"); 

var foo = new Foo(3, 4) 

var Foo2 = foo.change(function (a, b) { return a * b; }, "d"); 

var foo2 = new Foo2(3, 4) 

console.log(foo.c, foo2.d) // => 7 12 

这样做的更好的方式是这样的...

function Foo(a, b) { 
    var self = this; 
    this.add = function (name, fn) { 
    self[name] = fn.call(self, a, b); 
    } 
} 

var foo = new Foo(3, 4); 
foo.add("c", function (a, b) { return a + b; }); 
foo.add("d", function (a, b) { return a * b; }); 

console.log(foo.c, foo2.d) // => 7 1 
1

有没有办法来编辑功能,您可以通过在目前情况下分配等功能,以相同的名称替换它或者你可以把它轻松地从外面修改:

function foo(a, b) { 
    this.c = this.op !== undefined ? this.op(a, b) : (a + b); 
} 

var bar = new foo(2, 3); // bar.c === 5 

foo.prototype.op = function(a, b) { 
    return a * b; 
} 

var bar2 = new foo(3, 4); // bar.c === 12 

这样一来,你的函数或者是使用默认的代码(A + b),或者也可以在任何时间重写由定义运算功能原型。

+0

需要通过正在编辑的功能进行协作,尽管 – tucuxi 2012-07-12 17:12:25

+0

@tucuxi:的确如此,我在回答中添加了一句话,谢谢! – Tomek 2012-07-12 17:17:23

0

当您编写foo2 = foo时,您只需为foo调用foo2为别名;没有复制或覆盖正在进行。当你写foo2.d时,你指的是foo.d的另一个名字;和foo.d === undefined。另外,a和b只在foo的内部范围内才有意义(因此也是未定义的)。

你可以写foo的一个新的定义,但是:当然

function foo(a, b) { 
    this.d = a*b; 
    this.c = a+b; 
} 

上一页富对象将受到影响;而你的“foo2”会一直指向foo的前一个版本。

1

我想你正在尝试的是JavaScript中的继承?

// base class contains only "sum" method 
function foo(a, b) { 
    this.a = a; 
    this.b = b; 
} 

foo.prototype.sum = function(){ 
    return this.a + this.b; 
} 

// derived class contains new "multiply" method 
function foo2(a, b){ 
    foo.call(this, a, b); 
} 

foo2.prototype = new foo(); 

foo2.prototype.multiply = new function(){ 
    return this.a * this.b; 
} 

// test drive! 
var foo2Obj = new foo2(5, 4); 
console.log(foo2Obj.sum()); // 9 
console.log(foo2Obj.multiply()); // 20