在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; })();
答案 0 :(得分:8)
在我看来,在JavaScript中创建类的最佳方法是“不要”。原谅我是直率的,但在使用JavaScript时,试着忘记类 - 它们在这里不存在 - 并接受该语言只处理对象。
没有语言类,意味着要编写的代码更少。在典型的应用程序中,大多数对象没有任何兄弟姐妹。您将只有一个document
,一个window
,一个userList
等。使用对象文字表示法创建这些对象:
var userList = {
users: []
};
虽然JavaScript中没有类,但有构造函数和原型。当您有几个相似的对象(例如userlist
中包含的用户)时,这些概念会派上用场。您的代码示例使用了这两个概念。使用像myclass
这样的名称,很难说出你想要建模的东西。以下是User
构造函数的示例以及对其原型的扩展:
var User = function (name) {
this.name = name;
};
User.prototype.sayHello = function () {
return "Hello, my name is " + this.name;
};
答案 1 :(得分: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());
答案 2 :(得分:2)
Javascript使用原型继承。
如果你想创建自定义类,我建议你阅读原型继承是什么,而不是试图强迫c#方法论到js(实现基于类的继承优于原型)
答案 3 :(得分:2)
没有“最好”的方式。 JavaScript中有一些OOP模式,你提到的那个是其中之一(也是一个流行的模式)。它本质上是一个原型(或伪经典)模式,带有一个闭包来封装基于私有类的静态变量。
还有其他模式(例如Douglas Crockford推荐的功能模式)。
我个人推荐伪经典模式(尽管哪种模式最好是辩论的热门领域)。
如果您使用JavaScript进行OOP,我强烈建议您考虑采用内置OOP的JavaScript库,例如The Dojo Toolkit或Closure Library。其他库(例如jQuery,MOOtools,Ext等)都有OOP模块和/或插件。