【问题标题】:Class keyword in JavascriptJavascript中的类关键字
【发布时间】:2010-12-16 06:50:26
【问题描述】:

根据this article,它应该是定义类的Javascript 2.0方式。但是,我在实践中从未见过这种情况。因此问题。如何使用class关键字与Javascript 1.x的处事方式有什么区别?

【问题讨论】:

  • 页面顶部的大红字“February 1999 Draft”应该是该文章可能与现实世界没有太大关联的线索;-)
  • 您的意思很像现在实际上是规范的 HTML 5 草案? ;)
  • 好点 - 虽然 HTML5 最近更新了 :-)

标签: javascript class


【解决方案1】:

您在实践中从未见过它,因为几乎没有任何东西支持 JavaScript 2.0。该草稿来自一个在草稿之前就已经死亡的规范。

【讨论】:

    【解决方案2】:

    您在实践中从未见过class 关键字的原因是all the current implementations of JavaScript are 1.x.

    JavaScript 2.0 was merged into ECMAScript 4 which was rather unpopular 因此从未进入现实世界。

    那么回答您的问题,您如何使用class 关键字?你不能。

    【讨论】:

    • 感谢您的评论。不过有趣的事情。 Visual Studio 2008 在编写 JavaScript 文件时将其识别为有效关键字。
    • @Validimir - VS2008 可能会识别 class 关键字,因为您可以在 JScript.NET 中使用它。
    • class(以及许多其他 java 关键字)是一个保留字,因此从理论上讲,该语言可以在不破坏现有程序的情况下添加支持。 developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… 有完整列表。
    • 您现在可以使用class 关键字开始 ECMA6(又名 ECMA 2015),如下面@AkhilArjun 的帖子所述。
    • 参考@AkhilArjun 的回答。我觉得他的回答更有用。
    【解决方案3】:

    当然,你仍然可以使用原型在 JS 中构建类!

    var foo = function() {
      this.hurrah = "yay!";
      return this;
    }
    
    foo.prototype.doit() {
      alert(this.hurrah);
    }
    

    【讨论】:

    • 问题具体问的是class关键字而不是没有关键字的class怎么写
    【解决方案4】:

    如果您有 Java 或 C# 背景,以下是在 JavaScript 中定义类的方法

    var MyClass = function (f, l){//constructor 
        //private members
        var firstName = f,
            lastName = l,
            fullName = function () { //fullName is a private function
                return firstName + " " + lastName;
            };
        return {
            //public members
            getFullName: fullName 
        };
    }
    
    var output = document.getElementById('Output'); //<div id="Output"></div>
    var myName = new MyClass("First", "Last");
    output.innerHTML = myName.getFullName();
    

    【讨论】:

    • 你所拥有的并不是一个完全的类,它只是一个对象。为了将其称为类,您必须具有不返回任何内容的构造函数,并且能够将事物附加到其原型,并且还应该有一种从该类继承的方法。没有办法从这个对象正确继承,因为它没有原型链。请注意,这种方法对内存不友好,因为它将其方法存储在闭包中,而不是原型中,它确实隐藏了标准 JS 原型类系统不隐藏的私有成员。
    【解决方案5】:

    只是添加了ECMA5的类制作方式。

    注意,这种方式没有构造函数(但如果你愿意,可以触发init函数)

    var Class = {
          el: null,
          socket: null,
    
          init: function (params) {
    
            if (!(this.el instanceof HTMLElement)) {
              throw new Error('Chat room has no DOM element to attach on.');
            }
    
            return this.doStuff();
    
          },
          doStuff: function (params) {
            return this;
          }
    };
    
    var instanceofClass = Object.create(Class, {
      el: {
        value: document.body.querySelector('.what ever')
      },
      someMoreData: {
        value: [0,5,7,3]
      }
    }).init();
    

    【讨论】:

      【解决方案6】:

      我知道这是一篇旧文章,但从今天开始,即随着 ECMAScript 6 的出现,我们可以声明 javascript 类。

      语法如下:

      class Person{
        constructor(name){
          this.name = name;
        }
        printName(){
          console.log('Name is '+this.name);
        }
      }
      var john = new Person('John Doe');
      john.printName(); // This prints 'Name is John Doe'
      

      可以在this post找到完整的指南

      【讨论】:

      • 这应该是我们目前生活的现代 JS 世界中公认的答案。
      【解决方案7】:

      总结

      ES6 中引入了class 关键字。 class 关键字只不过是现有原型继承模式之上的语法糖。 javascript 中的类基本上是编写构造函数的另一种方式,可用于使用new 关键字创建新对象。

      示例

      class Person {
      
        constructor(name) {
          this.name = name;
        }
        talk() { console.log('hi'); }
      }
      
      const me = new Person('Willem');
      
      console.log(typeof Person) 
      // logs function, Person class is just another constructor function under the hood
      
      console.log(me.__proto__ === Person.prototype) 
      // logs true, classes just use the same prototypal inheritance pattern which is used by constructor functions. 
      // An object created with the new keyword gets a __proto__ property on it which is a reference to the prototype property on a constructor function.

      在上面的示例中,在第一个日志中可以观察到,从 class 关键字创建的类实际上是底层函数。

      console.log(typeof Person) // logs 'function'
      

      es6 类使用与构造函数相同的原型继承模式。这是另一个演示此行为的示例:

      class Dog {
      
        constructor (name) {
            this.name = name;
        }
        
        bark () { console.log('bark') };
      
      }
      
      let doggie = new Dog('fluffy');
      
      doggie.bark(); // logs bark
      
      
      Dog.prototype.bark = () => console.log('woof');  
      // changing the prototype of Dog, doggie refers to this with its __proto__ property. 
      //Therefore doggie bark method has also changed.
      
      
      doggie.bark(); // logs woof

      上面例子的要点是任何狗实例的 bark 方法都可以在运行时改变。这是因为用 Dog 类创建的任何对象的 bark 方法都只是引用了这个函数。

      【讨论】:

      • 这应该是我们目前生活的现代 JS 世界中公认的答案。
      猜你喜欢
      • 2016-03-22
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      相关资源
      最近更新 更多