创建javascript类时使用什么模式?

use*_*800 7 javascript oop

在Javascript中创建类(如在OOP中)的最佳方法是什么?现在我使用以下模式.好吗?

var myclass = (function() {
var _name;
var baseObject = {
    a: 10,
    c: function() {
        return _name + " world " + privateFunc();
        }
};
function privateFunc() { return _name + "-ba"; };

function myclass(name) {
    _name = name;
    this.x = 9;
};
myclass.prototype = baseObject;
return myclass; })();
Run Code Online (Sandbox Code Playgroud)

Jør*_*ode 8

在我看来,在JavaScript中创建类的最佳方法是"不要".原谅我是直率的,但在使用JavaScript时,试着忘记类 - 它们在这里不存在 - 并接受语言只处理对象.

没有该语言的类,意味着要编写的代码更少.在典型的应用程序中,大多数对象没有任何兄弟姐妹.您将只有一个document,一个window,一个userList等.使用对象文字表示法创建这些对象:

var userList = {
    users: []
};
Run Code Online (Sandbox Code Playgroud)

虽然JavaScript中没有类,但有构造函数原型.当您有几个相似的对象(例如,包含在a中的用户userlist)时,这些概念会派上用场.您的代码示例使用了这两个概念.使用类似名称myclass,很难说你想要建模什么.以下是User构造函数的示例以及对其原型的扩展:

var User = function (name) {
    this.name = name;
};

User.prototype.sayHello = function () {
    return "Hello, my name is " + this.name;
};
Run Code Online (Sandbox Code Playgroud)

  • 我不明白(来自C++)是为什么关于JS是否有类的蠢事.你的答案,即使你声称不是,也是在创建课程.与实现细节无关 - 逻辑上您定义特定类型的对象,具有函数,属性和多个实例(以及继承)的能力. (8认同)

Mav*_*ave 7

以下示例说明了我个人随着时间推移开发的模式.

它利用范围来允许私有字段和方法.

有关详细讨论,请查看JavaScript类模式

Employee = (function(){

  // private static field
  var staticVar;

  // class function a.k.a. constructor
  function cls()
  {
    // private instance field
    var name = "";
    var self = this;

    // public instance field
    this.age = 10;

    // private instance method
    function increment()
    {
        // must use self instead of this
        self.age ++;
    }

    // public instance method  
    this.getName = function(){
        return cls.capitalize(name);
    };

    this.setName = function(name2){
        name = name2;
    };

    this.increment = function(){
        increment();
    };

    this.getAge = function(){
        return this.age;
    };
  }

  // public static field
  cls.staticVar = 0;

  // public static method
  cls.capitalize = function(name){
      return name.substring(0, 1).toUpperCase() + 
          name.substring(1).toLowerCase();
  };

  // private static method
  function createWithName(name)
  {
    var obj = new cls();
    obj.setName(cls.capitalize(name));
    return obj;
  }

  return cls;
})();

john = new Employee();
john.setName("john");

mary = new Employee();
mary.setName("mary");
mary.increment();

alert("John's name: " + john.getName() + ", age==10: "+john.getAge());
alert("Mary's name: " + mary.getName() + ", age==11: "+mary.getAge());
Run Code Online (Sandbox Code Playgroud)


Ste*_*ung 2

没有“最好”的方法。JavaScript 中有几种 OOP 模式,您提到的就是其中之一(也是一种流行的模式)。它本质上是一个原型(或伪经典)模式,带有一个闭包来封装基于私有类的静态变量。

还有其他模式(例如Douglas Crockford 推荐的功能模式)。

我个人推荐伪经典模式(尽管哪种模式最好是争论的热点领域)。

如果您使用 JavaScript 进行 OOP,我强烈建议您考虑采用内置 OOP 的 JavaScript 库,例如Dojo ToolkitClosure Library。其他库(例如 jQuery、MOOtools、Ext 等)都有 OOP 模块和/或插件。