【问题标题】:ES5 Javascript encapsulated object autoincrement idES5 Javascript封装的对象自增id
【发布时间】:2018-10-17 20:02:38
【问题描述】:

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

我把你放在一个场景中,我有一个封装的产品 """"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()方法访问。

提前致谢。

【问题讨论】:

    标签: javascript ecmascript-5


    【解决方案1】:

    你可以使用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 stackoverflow answer

    【讨论】:

    • 你错过了 didactic 部分 - OP 真的希望你解释这个答案,它是如何工作的以及为什么工作。
    • 虽然是真的,但 OP 确实指定了 ES5。
    • 那是真的,会修改我的答案
    • 谢谢。它回答了我的问题,感谢您翻译成 ES5。我认为也不支持'const',但无论如何你回答了我的问题。非常感谢。
    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多