0

我们使用这种结构模拟 JavaScript 中的类:

OurApplication.TableViewer = Class.extend ({
    init: function() {},
    viewLogic: function() {},
    logLogic: function() {}
}

Class.extend 是一个像构造函数一样运行“init”的函数,并且以某种类似于 Java 的方式模拟类。我认为这类似于 Crockford 所说的“经典继承”,而且这种通用方法(如果不是确切的语法)似乎有点常用/推荐,所以我希望它没有争议。

我的问题是,“类”的全局数据应该如何最好地在同一个“类”内的函数之间传递;

方法一:

OurApplication.TableViewer = Class.extend ({
    init: function() {
        this.foo = 'bar';
        viewLogic();
        logLogic();
    },
    viewLogic: function() {
        document.write(this.foo);
    },
    logLogic: function() {
        console.log(this.foo);
    }
}

方法B:

OurApplication.TableViewer = Class.extend ({
    init: function() {
        viewLogic('bar');
        logLogic('bar');
    },
    viewLogic: function(foo) {
        document.write(foo);
    }
    logLogic: function(foo) {
        console.log(foo);
    }
}

我找不到很多,但我确实找到了这篇我认为是相同主题但针对 Java 的帖子。我会说它几乎不支持“方法A”,但一点也不清楚。

显然,在某些情况下,将数据作为参数传递是有意义的(例如,在每次传递的值都会更改的循环内;您可以每次将 'this.foo' 更改为新值,但这似乎很尴尬) .

任何意见/见解表示赞赏。

4

2 回答 2

1

这取决于实施。如果您想到 JavaScript 中“类”的基本实现,全局属性将附加到构造函数,实例属性this和公共方法附加到prototype

var Car = (function CarClass(){

  // Private sutff to be shared with all instances
  var className = 'Car';

  // Constructor
  function Car(make, model) {
    // Instance properties
    this.make = make;
    this.model = model;
  }

  // Global public properties to be shared with all instances
  Car.colors = ['red', 'green', 'blue', 'gray'];

  // Public methods
  Car.prototype = {

    // Method that uses private, global, instance and local variables
    getCarInManyColors: function() {
      return Car.colors.map(function(color) {
        return className +': '+ color +' '+ this.make +' '+ this.model;
      }.bind(this));
    }
  };

  return Car;
}());
于 2013-09-17T00:10:57.133 回答
0

我认为作为类成员的数据(对于使用您自己的术语的类来说是全局的)永远不需要传递给它的函数,否则,将它作为成员字段进行跟踪有什么意义?

所以问题变成了:数据应该是类的成员吗?从 OOP 的角度来看,如果数据在相当长的时间内保持不变,它应该。换句话说,在您的示例中,如果在foo调用 viewLogic 和 logLogic 时传递的变量趋于保持不变,那么我会将其存储为成员。

如果您想以更面向对象的方式使用 JavaScript,我建议您查看Typescript

于 2013-09-16T23:59:32.240 回答