使用经典继承,在 JavaScript 中使用“类级”/成员变量是一个好主意还是坏主意

Using classical inheritance, is it a good or bad idea to use 'class level' /member variables in JavaScript?

本文关键字:好主意 一个 成员 继承 经典 JavaScript 类级 变量      更新时间:2023-09-26

我们使用这种结构模拟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"更改为新值,但这似乎很尴尬)。

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

这取决于实现。如果你想到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;
}());
我认为作为

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

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

如果你喜欢以更面向对象的方式使用JavaScript,我敦促你查看Typescript

相关文章: