簡體   English   中英

類似於c ++中用於javascript的基於堆棧的對象

[英]something like stackbased objects in c++ for javascript

在javascript中尋找一個構造,就像在c ++中的stackbased或local對象中的析構函數一樣,例如

#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)。

干杯,毫克

如果保證范圍中的代碼是同步的,則可以創建一個之后調用析構函數的函數。 它可能不那么靈活,語法可能不像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

遺憾的是,由於語言設計不強制執行ECMAScript引擎(即javascipt解釋器)來執行您的要求,因此您無法找到所需內容。

當沒有更多對象超出范圍的引用時, 垃圾收集器會(實際上它更像是一種“可能”),但是沒有任何標准化的方式(作為開發人員)可以利用這個。

有一些黑客攻擊(例如將對象的使用包裝在一個dtor對象本身的函數中,以及一個“用法” - 回調函數)來提供類似於C ++中dtor的功能,但不是沒有采取任何“額外操作”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM