你如何用JavaScript制作课程?

时间:2010-07-19 04:21:30

标签: javascript class function

你们如何用JavaScript制作“课程”?

我正在使用:

function classFoo()
{
   var classLevelVariable = 0;

   this.classFunction = function()
   {
      alert("The classFunction has been called.");
      classFunction2(); //Crash.  classFunction2 is "undefined."  
   }

   this.classFunction2 = function()
   {
      alert("classFunction2 called.");
   }
}

我从来没有能够让施工人员工作。试图

this.New = function(arguments)

哪一次工作,但不是二等。所以,我现在已经完全放弃了这些,使用我自己的“初始化”函数作为构造函数。

它工作一次但不是两次的奇怪使我想到两个类之间的印刷错误......但我认为在19年的编码中,可能不是它。

我正在使用Chrome的调试器,除了第二个函数在被调用时未定义时,我没有收到任何错误。

6 个答案:

答案 0 :(得分:8)

Javascript不使用基于类的继承。所以,你不能在Javascript中创建类,除非使用workarounds来模拟它们,这些是恕我直言并且很复杂的。

Javascript是一种原型语言。使用new关键字基于构造函数对象的prototype属性创建一个新对象。

您可以在此处了解如何使用原型继承来基于原型对象实例化新对象:http://javascript.crockford.com/prototypal.html

答案 1 :(得分:7)

我觉得你原来的咆哮(见问题的修订历史)值得回应。在我看来,这非常违背编程和计算机科学的精神,仅仅因为你不能make it go而宣布一种语言被破坏。

如果我冒昧地告诉我,当我说我很惊讶他们可以将CS学位给那些具有这种范式无知的人时,我会感到诧异。当我去学校,这是只有大约5年前,我做了我的任务在6种不同的语言:MIPS,Verilog的,方案,Java和C / C ++和Python。我们使用了许多范例,包括功能和OOP,但也包括其他风格。如果你没有接触到这些不同的观点,其中没有一个是新的,那么你的教育就不完整了。

您是否认为您认为规范OOP 仅仅是OOP原则的一个表述?在Javascript对象中实例化“原型”,它与类不同。当您希望它像基于类的OOP语言一样工作时,它将无法满足您的期望。 Java和C ++不是OOP的黄金标准,OOP也不是所有编程的全部。

当人们考虑过去3 - 5年内用Javascript编写的令人惊叹的应用程序时,一个人可以做出这样的声明真是太神奇了:

  

有人会认为我们会在过去的六十年里将最好的编码方法应用到其中。不,当然不。我们有什么?函数内部的函数......类的一些奇怪的混蛋。完全没有一致性......

要这么说,尽管绚丽的JavaScript开发小组所取得的辉煌成就,语言被打破,因为的的很难理解它,没错,是惊人的。

请注意,您现在可能不具备理解它所必需的视角,而不是语言存在缺陷。


PS,你提到你“使用JavaScript来避免闪存!”由于Javascript和Actionscript都实现了相同的规范:ECMAScript,因此您似乎很难确定事实的策略。

答案 2 :(得分:5)

JavaScript是一种基于原型的编程语言。类的概念不存在或类的概念与对象相同。它与Java编程语言完全不同。不要被他们的名字所迷惑,这些相似之处就在那里。

我回来时问this question我。我得到了John Resig与these presentation slides的一个很好的链接。看一下,看看它是否有助于理解JavaScript和原型链。

答案 3 :(得分:2)

Heresitepoint.com关于JavaScript中面向对象编程的好文章。

This javascriptkit.com上的一个更直接。

您可以使用函数创建一个对象集,其属性和函数如下:

person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"

person.run = function() {
    this.state = "running"
    this.speed = "4ms^-1"
}

或使用构造函数:

function person(name,height,speed){
    this.name = name;
    this.height = height;
    this.speed = speed;
}

var p1=new person('tom', '6ft','15kmph');

alert(p1.height);

或者您可以使用原型设计来扩展对象:

person.prototype.sayHello = function(){alert("Hi, I'm " + name;}

var p2 = new person('sam', '5.9ft', '12kmph');
p2.sayHello();//alert-> Hi, I'm sam

链接页面上有更深入的详细信息。

答案 4 :(得分:1)

JavaScript是Prototyping Language,因此情况略有不同。

以下是一段代码摘要:

(function(){ // create an isolated scope
    // My Object we created directly
    var myObject = {
        a: function(x,y) {
            console.log('a');
        },
        b: function(x,y) {
            console.log('b');
            this.a(x,y);
        }
    };
})();

(function(){ // create an isolated scope

    // Create a Object by using a Class + Constructor
    var myClass = function(x,y) {
        console.log('myClass: constructor');
        this.b(x,y);
    };
    myClass.prototype = {
        a: function(x,y) {
            console.log('myClass: a');
        },
        b: function(x,y) {
            console.log('myClass: b');
            this.a(x,y);
        }
    };

    // Define a function that should never inherit
    myClass.c = function(x,y) {
        console.log('myClass: c');
        this.a(x,y);
    };

    // Create Object from Class
    var myObject = new myClass();
    // Will output:
    // myClass: constructor
    // myClass: b
    // myClass: a

    // Define a function that should never inherit
    myObject.d = function(x,y) {
        console.log('myObject: d');
        this.a(x,y);
    };

    // Test the world is roung
    console.log(typeof myClass.c, 'should be undefined...');
    console.log(typeof myClass.d, 'should be function...');
})();

(function(){ // create an isolated scope
    // If you are using a framework like jQuery, you can obtain inheritance like so

    // Create a Object by using a Class + Constructor
    var myClass = function(x,y) {
        console.log('myClass: constructor');
        this.b(x,y);
    };
    myClass.prototype = {
        a: function(x,y) {
            console.log('myClass: a');
        },
        b: function(x,y) {
            console.log('myClass: b');
            this.a(x,y);
        }
    };

    // Create new Class that inherits
    var myOtherClass = function(x,y) {
        console.log('myOtherClass: constructor');
        this.b(x,y);
    };
    $.extend(myOtherClass.prototype, myClass.prototype, {
        b: function(x,y) {
            console.log('myOtherClass: b');
            this.a(x,y);
        }
    });

    // Create Object from Class
    var myOtherObject = new myOtherClass();
    // Will output:
    // myOtherClass: constructor
    // myOtherClass: b
    // myClass: a
})();

(function(){ // create an isolated scope
    // Prototypes are useful for extending existing classes for the future
    // Such that you can add methods and variables to say the String class
    // To obtain more functionality
    String.prototype.alert = function(){
        alert(this);
    };
    "Hello, this will be alerted.".alert();
    // Will alert:
    // Hello, this will be alerted.
})();

有一些图书馆可以帮助解决这个问题,例如:

答案 5 :(得分:-2)

使用Prototype javascript框架。