我正在生成许多“类”(实际上是试图像c#或其他面向对象的语言一样模拟类的函数),并且正在寻找实现此目的的最佳方法。
您可能会注意到,我也提供了jQuery。

这是此时生成所有类的方式:

MyClass = (function() {
  function innerClass() {

    var self = this;
    var myField;

    // This function works as the constructor
    this.init = function(opts) {
      // Arguments to the constructor
      var defaultOpts = {
        myInitArgument: null
      }
      opts = $.extend(defaultOpts, opts);
      self = this;

      // Any custom constructor code is generated here...
    }

    // A function
    this.myFunction = function() {
      myField = "Hello World!";
    }

    // Returns an object with all selected fields and function that should work as "public". Those not mentioned here, will not be visible outside this class.
    return {
      init: this.init,
      myFunction: this.myFunction,
      myField: myField,
    }
  }
  return innerClass;
})();


然后,我创建此类的实例:

var myObject = new MyClass();
myObject.init({myInitArgument: 'test'});


我的主要问题是在myFunction内部,“ myField”将设置为“ Hello World!”。如果我中断了调试器(即Chrome开发者工具),但使用“ myObject.myField”则返回未定义。

如果您想玩这个示例,我做了一个fiddle

解决此问题的最佳方法是什么,也许还有其他事情要警告我?

最佳答案

在制作类和对象时,JavaScript有点怪异。 IMO,这是最可靠且易读的方法:从成为原始对象(Fruit)的函数开始。

编辑:感谢@Bergi指出以前的版本具有残留变量,需要将其移至init()。

function Fruit(opts) {
    this.init(opts);
}


现在,扩展功能,为其提供更多功能,例如init等:

Fruit.prototype.init = function(opts) {
    // init values go here
    this.cost = 0;
    this.count = 0;

    var that = this;  // in the iteration below, we want to refer to our parent
    for( k in opts )(function(k, v) {
        that[k] = v;
    })(k, opts[k]);
}

// now, here's a specialized set of functions that sets properties (price/quant)
// note that they do "return this" - this is so you can conveniently chain
// commands. ex: apple.setPrice(10).setQuantity(5);
Fruit.prototype.setPrice = function(how_much) {
    this.cost = how_much;
    return(this);
}

Fruit.prototype.setQuantity = function(how_many) {
    this.count = how_many;
    return(this);
}


用于返回计算值的简单函数。此时,实例化后,对象将变为“自我感知”。这样的辅助函数变得更具可读性。

Fruit.prototype.getEarnings = function() {
    return( this.cost * this.count );
}


到目前为止,我们仅设置了抽象结构。要使用此功能,请创建一个新对象:

var apple = new Fruit({ genus: 'Malus' });
var orange = new Fruit({ genus: 'Citrus' });

apple.setPrice(1.50).setQuantity(20);
orange.setPrice(1.25).setQuantity(40);

console.info( apple.genus + " will earn you $" + apple.getEarnings() );   // $30
console.info( orange.genus + " will earn you $" + orange.getEarnings() ); // $50

09-17 09:02