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;
}
4

4 回答 4

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
于 2012-07-12T17:08:01.163 回答
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),要么可以随时通过在原型中定义 op 函数来覆盖它。

于 2012-07-12T17:08:14.363 回答
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
于 2012-07-12T17:12:42.370 回答
0

当您编写 foo2 = foo 时,您只是为 foo 创建了一个别名,称为 foo2;没有进行复制或覆盖。当您编写 foo2.d 时,您指的是 foo.d 的另一个名称;和 foo.d === 未定义。此外, a 和 b 仅在 foo 的内部范围内有意义(因此也是未定义的)。

但是,您可以为 foo 编写一个新定义:

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

以前的 foo 对象当然不受影响;并且您的“foo2”将继续指向以前版本的 foo。

于 2012-07-12T17:10:43.460 回答