2011-03-22 35 views
7

在Javascript中创建类(如在OOP中)的最佳方式是什么? 现在我正在使用以下模式。可以吗?创建javascript类时使用什么样的模式?

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; })(); 
+0

这看起来颇为相似方式的CoffeeScript编译的类输出看起来像 – david 2011-03-22 08:45:42

回答

2

没有“最好的办法。 JavaScript中有一些OOP模式,你提到的是其中的一种(也是一种流行的模式)。它本质上是一个典型的(或伪古典)模式,用封闭来封装基于私有类的静态变量。

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

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

如果你是用JavaScript实现面向对象编程,我强烈建议您考虑采用一个JavaScript库,具有OOP内置的,如The Dojo ToolkitClosure Library。其他库(例如jQuery,MOOtools,Ext等)都有OOP模块和/或插件。

+0

感谢您提出我目前的模式。目前,我正在将代码添加到使用jQuery的现有软件中。我想知道Dojo或Closure库是否适用于jQuery ... – user670800 2011-03-22 09:10:06

+0

Dojo或Closure既可以与jQuery一起工作,也可以不需要,因为jQuery将复制它们的大部分功能。你最好坚持使用jQuery和OOP插件。我知道John Resig正在研究将正式的类系统构建到jQuery中。 – 2011-03-22 09:39:15

2

Javascript使用原型继承。

如果你想创建自定义类,我会建议读了什么是典型的遗传有关,而不是试图迫使C#方法到JS(实现了典型的基于类的继承)

http://phrogz.net/js/classes/OOPinJS.html

+0

你永远不会实现在JS基础类继承。你只能让它看起来基于课堂。但最终,超级方法和属性将始终在原型链中查找。 – 2011-03-31 16:49:49

8

在我看来,在JavaScript中创建类的最好方法是“不要”。请原谅我的直言不讳,但是在使用JavaScript时,请尽量忘掉类 - 它们在这里不存在 - 并且接受该语言只处理对象。

没有语言中的类,意味着要编写的代码更少。在典型的应用中,大多数物体没有任何兄弟姐妹。您将只拥有一个document,一个window,一个userList等使用对象的文字符号创建这些对象:虽然有在JavaScript中没有类

var userList = { 
    users: [] 
}; 

,有构造原型。当您有几个相似的对象时(例如,包含在userlist中的用户),这些概念会派上用场。您的代码示例使用了这两个概念。使用像myclass这样的名字,很难说出你想要建模的东西。这里有一个User构造的例子,一个推广到它的原型:

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

User.prototype.sayHello = function() { 
    return "Hello, my name is " + this.name; 
}; 
+1

我建议你添加“在我看来”,因为与JavaScript的OOP的优点/缺点仍然激烈辩论。很多人会不同意你说OOP是最好的。 – 2011-03-22 08:39:01

+0

@Stephen:你可能是对的。前面添加了恕我直言免责声明:) – 2011-03-22 08:42:47

+8

我不明白(来自C++)是为什么有这么多的关于JS是否有类的麻烦。你的答案,即使你声称不是创建类。与实现细节无关 - 从逻辑上讲,您定义了一种特定类型的对象,并具有函数,属性和多个实例(以及继承)的功能。 – Jono 2013-02-20 05:27:09

7

下面的例子说明,我个人随着时间的推移开发的模式。

它利用范围允许私人领域和方法。

详细讨论,请看看JavaScript class patterns

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()); 
相关问题