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

あなたがしようとしているのは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 に答える
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 に答える
0

foo2 = foo と書くと、foo2 という名前の fooのエイリアスを作成するだけです。コピーや上書きは行われません。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 に答える