5

スタックベースのデストラクタまたは C++ のローカル オブジェクトのように機能する JavaScript のコンストラクトを探します。

#include <stdio.h>
class M {
public:
  int cnt;
  M()        {cnt=0;}
  void inc() {cnt++;}
  ~M()       {printf ("Count is %d\n", cnt);}
};
...
{M m;
 ...
 m.inc ();
 ...
 m.inc ();
} // here the destructor of m will printf "Count is 2");

したがって、これは、スコープが終了するとき(「スコープ外になる」とき)にアクションを実行する構造を探していることを意味します。C++ のデストラクタ (mutex-alloc と release をラップするために使用される) のように、スコープの最後で特別なアクションを必要としないという点で堅牢である必要があります。

乾杯、mg

4

2 に答える 2

1

スコープ内のコードが同期であることが保証されている場合は、後でデストラクタを呼び出す関数を作成できます。ただし、柔軟性が低く、構文が C++ ほどきれいではない場合があります。

var M = function() {
  console.log("created");
  this.c = 0;
};

M.prototype.inc = function() {
  console.log("inc");
  this.c++;
};

M.prototype.destruct = function() {
  console.log("destructed", this.c);
};


var enterScope = function(item, func) {
  func(item);
  item.destruct();
};

次のように使用できます。

enterScope(new M, function(m) {
  m.inc();
  m.inc();
});

これはログに記録されます:

created
inc
inc
destructed 2
于 2012-11-04T11:48:11.373 に答える
1

残念ながら、言語設計では ECMAScript エンジン (つまり、javascipt インタープリター) の実装が必要なことを強制されないため、探しているものを見つけることができません。

ガベージ コレクターは (実際には「可能性」のほうが大きい) 範囲外になるオブジェクトへの参照がなくなると作動しますが、(開発者として) 利用するための標準化された方法はありません。これ。

C++と同様の機能を提供するためのハック (オブジェクト自体を受け取る関数と「使用」コールバック関数でオブジェクトの使用をラップするなど) がありますが、dtor「追加のアクション」を実行しないわけではありません。

于 2012-11-04T11:48:35.757 に答える