如果我有一个运行一些初始化代码的javascript类,那么把这个代码放在顶部,以及类底部的任何方法似乎都是合乎逻辑的。问题是,如果初始化代码包含方法调用,我得到'undefined'不是函数错误。我想是因为该方法是在方法调用之后定义的。人们通常如何构建javascript类以避免这种情况?他们是否将所有初始化代码放在课程的最后?例如:
var class = function() {
this.start();
this.start = function() {
alert('foo');
};
};
var object = new class();
导致错误,而:
var class = function() {
this.start = function() {
alert('foo');
};
this.start();
};
var object = new class();
没有。什么被认为是像这样的javascript对象的好结构?
答案 0 :(得分:2)
这就是我要做的事情
// create a "namespace"
var com = com || {};
com.domain = com.domain || {};
// add "class" defintion
com.domain.MyClass = function(){
var privateFields = {};
var publicFields = {};
privateFields.myFunction = function(){
// do something
}
publicFields.initialize = function(){
privateFields.myFunction();
}
return publicFields;
}
var myClass = new com.domain.MyClass();
myClass.initialize();
当然,您可以将initialize();
设为“私有”并在return publicFields;
之前运行
答案 1 :(得分:1)
var class = function() {
this.start();
};
class.prototype.start = function() {
alert('foo');
};
var object = new class();
现在你可以在构造函数中尽可能多地启动。但是不要使用关键字class,因为它是一个保留字。
答案 2 :(得分:0)
我实际上用这样的结构做了很多工作:
var foo = function() {
// Actual construction code...
start(); // <-- doesn't make a difference if functions are
privateMethod(); // public or private!
// ---------------------------------
function start() {
// ... whatever ...
};
function privateMethod() {
// ... whatever ...
};
// ---------------------------------
// Add all public methods to the object (if start() was only used internally
// just don't assign it to the object and it's private)
this.start = start;
};
答案 3 :(得分:0)
我喜欢http://ejohn.org/blog/simple-javascript-inheritance/,我觉得OOP编程更多。
var myClass = Class.extend({
init: function () {
this.foo();
},
foo: function () {
alert("foo");
}
});
new myClass();
答案 4 :(得分:0)
考虑在start
的原型上制作class
方法。这有节省内存的好处,因为class
的所有实例都可以共享相同的start
,而不是为每个实例创建新的start
函数。
var class = function() {
this.start();
};
class.prototype.start = function() {
alert('foo');
};
var object = new class();