Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不获取';未定义';不是一个函数错误吗?_Javascript - Fatal编程技术网

Javascript 如何在不获取';未定义';不是一个函数错误吗?

Javascript 如何在不获取';未定义';不是一个函数错误吗?,javascript,Javascript,如果我有一个运行一些初始化代码的javascript类,那么将此代码放在类的顶部,将任何方法放在类的底部似乎是合乎逻辑的。问题是,如果初始化代码包含方法调用,我得到的“未定义”不是函数错误。我想是因为方法是在方法调用之后定义的。人们通常如何构造javascript类来避免这种情况?他们是否将所有初始化代码放在类的末尾?例如: var class = function() { this.start(); this.start = function() { alert('fo

如果我有一个运行一些初始化代码的javascript类,那么将此代码放在类的顶部,将任何方法放在类的底部似乎是合乎逻辑的。问题是,如果初始化代码包含方法调用,我得到的“未定义”不是函数错误。我想是因为方法是在方法调用之后定义的。人们通常如何构造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对象,什么样的结构才算是好的呢?

我实际上经常使用这样的结构:

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;
};
var foo=function(){
//实际施工规范。。。
开始();//下面是我要做的

// 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();
设为“private”,然后在
返回publicFields;

之前运行它,我喜欢在这里编写OOP程序

var myClass = Class.extend({
  init: function () {
    this.foo();
  },

  foo: function () {
    alert("foo");
  }
});

new myClass();

现在,您可以在构造函数中随意使用start。但是不要使用关键字class,因为它是一个保留字。

考虑在
类的原型上使用
start
方法。这有节省内存的好处,因为
类的所有实例都可以共享相同的
start
,而不是为每个实例创建一个新的
start
函数

var class = function() {
   this.start();
};

class.prototype.start = function() {
   alert('foo');
};

var object = new class();

我得到的
类是Firebug中的一个保留标识符
:不过我猜这不是您所指的错误。@JaredFarrish是的,我意识到示例代码使用保留字。用foo切换类,用bar切换对象,自己尝试一下。更新后,现在我得到了
类型错误:this.start不是函数
错误。(在我发布最初的评论后,我意识到情况可能就是这样。)@JaredFarrish是的,这就是我最初的帖子所抱怨的错误。我个人的偏好是总是把函数定义放在顶部,就在我为该作用域和对象属性列出的变量列表的正下方。不过,这正是我喜欢组织它的方式。不清楚你为什么要
t.start=start;
,而不是首先,通过执行
this.start=function()…
,将方法定义为public?我将在顶部定义所有方法(public和private),这些方法应该可以从外部访问(public)在额外的步骤中分配给对象。这样,方法是公共的还是私有的都没有区别。换句话说:
start();
在类内部工作,无论它从外部的可见性如何。啊,是的,你是对的。我感到困惑,抱歉。我编辑了我的代码,现在它反映了底部有函数的版本。我喜欢这样。如果我没有错的话,这要求我们包括基“类”在博客文章中找到了定义?如何使用这种类编写方法创建非公共变量?一次性只需在方法中使用var。私有成员或方法javascript对象无法容纳。如果我使用原始文章中的示例,我可以使用私有方法和变量。你确定吗?我认为你可以使用“Private”方法仅用于构造函数。构造函数中定义的每个方法都继承构造函数的作用域,因此每个方法(公共或私有)都可以调用对象的任何其他方法并访问任何构造函数变量(这使这些变量/方法成为私有的)。如果要使用prototype将方法添加到构造函数范围之外的类中,则除非将它们设置为公共(使用
this.blah=
而不是
var blah=
),否则它们将无法调用其他方法或访问对象的其他变量。
var class = function() {
   this.start();
};

class.prototype.start = function() {
   alert('foo');
};

var object = new class();