ES5 Javascript 封装对象自增id

ES5 Javascript encapsulated object autoincrement id

出于教学兴趣,我想知道一种在创建对象时模拟自动增量变量的正确方法。

我把你放在我有一个封装的产品“”"class"”“”作为具有隐藏属性的对象的场景中。

(function() {

  var Product = (function() {
    function Product(name, description) {

      this.getName = function() {
        return name;
      };
      this.getDescription = function() {
        return description;
      };
      this.getProductId = function() {
        return productId;
      }
    }
    return Product;
  }());

  var p = new Product("Product1", "Should have id=1");
  var q = new Product("Product2", "Should have id=2");
  console.log(p);
  console.log(q);
})();

在这段代码中,如何或什么是添加计数器的最佳方式,以便每次我创建 Product 的新实例时,productId 都将具有连续的值,并且每个对象都保留自己的值。同时,上述 Id 只能通过方法 getProductId() 访问。

提前致谢。

你可以利用 Closures:

(function() {

  var Product = (function() {
    var nextId = 1;

    function Product(name, description) {
      var productId = nextId;
      nextId += 1;
      this.getName = function() {
        return name;
      };
      this.getDescription = function() {
        return description;
      };
      this.getProductId = function() {
        return productId;
      }
    }
    return Product;
  }());

  var p = new Product("Product1", "Should have id=1");
  var q = new Product("Product2", "Should have id=2");
  console.log(p.getProductId());
  console.log(q.getProductId());
})();

如果将一个函数包装在另一个函数中,则内部函数可以访问外部函数的所有变量。当您创建一个新的 Product 时,将调用 function Product(name, description);每次递增 nextId 1。如果你想看到更多关于闭包的例子,你可以看看 this Whosebug answer.