自动递增对象id JS构造函数(静态方法和变量)

Posted

技术标签:

【中文标题】自动递增对象id JS构造函数(静态方法和变量)【英文标题】:Incrementing object id automatically JS constructor (static method and variable) 【发布时间】:2016-02-06 20:27:00 【问题描述】:

我是 javascript 的新手,我有一个想法,要创建类(函数),我知道它在 JS 中是如何工作的(原型等),但我需要做一些事情,比如在数据库中增加 Id。

我的想法是创建静态方法,我认为闭包在这里非常适合,每当创建新对象时,它应该返回递增的 id。

我不知道实现这一点的正确方法是什么,或者这可能是一种不好的做法。

请提供简单的例子。

【问题讨论】:

【参考方案1】:

关闭是个好主意:

var MyClass = (function() 
  var nextId = 1;

   return function MyClass(name) 
      this.name = name;
      this.id = nextId++;
   
)();

var obj1 = new MyClass('joe'); //name: "joe", id: 1
var obj2 = new MyClass('doe'); //name: "doe", id: 2

或者,如果您想要一些更灵活的解决方案,您可以创建简单的工厂:

function MyObjectFactory(initialId) 
  this.nextId = initialId || 1;


MyObjectFactory.prototype.createObject = function(name) 
  return name: name, id: this.nextId++


var myFactory = new MyObjectFactory(9);
var obj1 = myFactory.createObject('joe'); //name: 'joe', id: 9
var obj2 = myFactory.createObject('doe'); //name: 'doe', id: 10

```

【讨论】:

感谢您的回答!!!你能解释一下第一个例子吗,如果我需要把一些逻辑检查构造函数的参数计数,例如像这样var Product = function Product() this.name = ""; this.amount = ""; this.price = ""; this.picture = ""; if (arguments.length == 4) this.name = arguments[0]; this.amount = arguments[1]; this.price = arguments[2]; this.picture = arguments[3]; ;我应该把这个逻辑放在返回函数的哪里?【参考方案2】:

由于节点是单线程的,这应该很容易并且相对安全。

我认为你可以通过创建一个全局变量来实现这一点

global.counter = 0

然后在构造时,您的类可以递增它,或者如果您需要在创建类时保持对值的引用,则递增并获取该值。

function YourClass() 
   global.counter++;

var yc = new YourClass(); // global.counter 1
var yc2 = new YourClass(); // global.counter 2

【讨论】:

有什么方法可以为对象(原型)静态执行此函数,例如当调用构造函数时执行此方法以获取对象的唯一 ID?以闭包为例 @Michael Prokopowicz 的答案明显更简洁 使用this post编写的静态函数示例 全局值会持续吗?

以上是关于自动递增对象id JS构造函数(静态方法和变量)的主要内容,如果未能解决你的问题,请参考以下文章

9——对象的创建和撤销,构造函数和析构函数

析构函数为啥能释放对象内存?

面向对象2

静态对象成员会在所属类的析构函数被调用时自动析构吗?

单例模式

php面向对象构造函数,析构函数