【问题标题】:How do you make classes in JavaScript?你如何在 JavaScript 中创建类?
【发布时间】:2010-07-19 04:21:29
【问题描述】:

你们如何在 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 的调试器,除了第二个函数在被调用时未定义之外,我没有收到任何错误。

【问题讨论】:

  • @John:查看编辑历史记录。我希望我已经对问题进行了充分的编辑,使其成为一个合理的问题。
  • classFunction2()classFoo()的方法时,你不能调用this.classFunction2(),如果你的内部是classFoo()
  • @John:我们必须同意不同意。您应该注意到,如果不进行编辑,他的问题将会很快结束。
  • 我很惊讶他们可以将 CS 学位授予如此无知的人。它被称为“原型”,它与类不同。尽管您的 CS 教授坚持,Java 和 C++ 并不是 OOP 的黄金标准,OOP 也不是编程的万能。看来您确定事实的策略很差,因为 Javascript 和 Actionscript 都实现了相同的该死规范 ECMAScript。
  • Javascript 是一种基于原型的编程。一种面向对象的编程风格,其中不存在类,并且行为重用(在基于类的语言中称为继承)是通过克隆用作原型的现有对象的过程来执行的。基于原型的编程 (en.wikipedia.org/wiki/Prototype-based_programming) - 基于类的编程 (en.wikipedia.org/wiki/Class-based_programming)

标签: javascript class function


【解决方案1】:

Javascript 不使用基于类的继承。因此,您不能在 Javascript 中创建类,除非使用 workarounds 模拟它们,恕我直言笨拙和复杂。

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

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

【讨论】:

【解决方案2】:

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

如果我说我很惊讶他们可以将 CS 学位授予具有如此范式无知的人,如果我冒犯了你,请原谅我。大约 5 年前,当我上学时,我用 6 种不同的语言完成了作业:MIPS、Verilog、Scheme、Java、C/C++ 和 Python。我们使用了许多范例,包括函数式和 OOP,但也使用了其他样式。如果你没有接触到这些不同的观点,它们都不是新的,你的教育是不完整的。

您有没有想过,您认为规范的 OOP 只是OOP 原则的一种表述?在 Javascript 中,对象从“原型”实例化,它与类不同。当您期望它像基于类的 OOP 语言一样工作时,它不会满足您的期望。 Java 和 C++ 不是 OOP 的黄金标准,OOP 也不是编程的万能。

当人们想到过去 3-5 年用 Javascript 编写的令人惊叹的应用程序时,一个人可以做出这样的陈述真是令人惊讶:

人们会认为我们会将过去 6 年的最佳编码实践应用到其中。不,当然不。我们有什么?函数内部的函数......类的一些奇怪的混蛋。没有一致性的完整...

要说,尽管优秀的 Javascript 开发人员团队取得了辉煌的成就,但语言却因为难以理解而被破坏,嗯,令人惊讶。

请考虑到,您目前可能不具备理解它所需的视角,而不是语言存在缺陷。


PS,您提到您正在“使用 JavaScript 避免 FLASH!”看来您确定事实的策略很差,因为 Javascript 和 Actionscript 都实现了相同的规范:ECMAScript。

【讨论】:

  • 好,辩论!这就是我所寻求的。 :-D 确实,我的计算机科学教育和工作经验一直以 C++、.NET 和 Java 为主,这绝对让我有偏见。在过去的几年里,我不得不做很多 Flash 工作,这让我感到非常沮丧,因为大部分语言似乎是两个世界之间的“半路”。虽然它有课程,但他们有很多问题。我发现的最可怕的一个是它偶尔会混淆引用,要求你使用肮脏的技巧,例如:
  • class MyClass { function TryingToCall() { } function Foo() { //this.TryingToCall();失败。说 TryingToCall 不存在。 var me:MyClass = this;我.TryingToCall(); //作品。 } }
  • 在使用 JavaScript 时,我也感受到了类似的挫败感,这就是为什么我写了一个巨大的咆哮:-)。我们都知道那种感觉……那种你知道自己在做“肮脏”的事情的感觉,但你只需要这样做才能让它发挥作用。我有那种用 JavaScript 做简单事情的感觉:-P.
  • 当然有很多方法可以实现任何东西。作为程序员,我们需要适应——我们每天都在这样做。我已经完成了我相当一部分的“伟大壮举”,例如在 Visual Basic 6 中使用 DirectX7——所以我绝不不尊重 JavaScript 中的那些伟大壮举。在适当的时候,我也会了解 JavaScript OOP 的工作原理。最终,最终产品只需要工作,而客户并不关心如何工作。这并不意味着无论是哪种语言都不能更好:-)。我的论点是,如果有这么多人试图在 JavaScript 中创建经典类......为什么不拥有它们?
  • (我并没有说我在避免使用 Flash,因为它让我发疯 [虽然这是事实,它让我发疯 :-P]。我正在避免使用 Flash,因为 iPhone 不支持 Flash和 iPad。)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    Thisjavascriptkit.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
    

    链接页面上有更多详细信息。

    【讨论】:

      【解决方案5】:

      JavaScript 是 Prototyping Language,所以有些不同。

      这里有一段代码sn-p来解释一下:

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

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

      【讨论】:

        【解决方案6】:

        通过使用 Prototype javascript 框架。

        【讨论】:

        • 您将 JS 库的原型 (prototypejs.org) 与通用原型继承原则(在别处提到)/原型 JS 关键字混淆了。
        猜你喜欢
        • 2014-08-28
        • 2017-06-30
        • 2020-04-24
        • 2011-03-03
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        相关资源
        最近更新 更多