ES5 Javascript封装对象自动增量id

Sam*_*Sam 1 javascript ecmascript-5

有了教学兴趣,我想知道一种正确的方法来模拟对象创建的自动增量变量.

我把你放在我有一个封装的Product""""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);
})();
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

dan*_*-sc 5

您可以使用闭包:

(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());
})();
Run Code Online (Sandbox Code Playgroud)

如果将函数包装在另一个函数中,则内部函数可以访问外部函数的所有变量.当你创建一个新的Product,function Product(name, description)被称为; 每次将nextId递增1.如果你想在闭包上看到更多的例子,你可以看一下这个stackoverflow的答案.

  • 你错过了_didactic_部分 - OP真的希望你解释这个答案,它的工作原理和原因. (2认同)
  • 虽然如此,OP确实指定了ES5. (2认同)