【问题标题】:Need help to create my first javascript class需要帮助来创建我的第一个 javascript 类
【发布时间】:2013-06-07 09:15:53
【问题描述】:

我被要求根据以下代码创建一个 javascript 类:

 var var1=new MyClass();

 MyClass.setDefaultYear("2013"); //sets default year for all instances of MyClass to 2013

 var1.getYear(); //returns 2013

 var1.year=2001; //sets year to 2001

 var1.getYear(); //returns 2001

 var var2=new MyClass();

 var2.getYear(); //returns 2013

困扰我的是:MyClass.setDefaultYear("2013")

我已经设法使其他一切正常工作,但我不明白如何使用"MyClass" 而不是实例名称。

我在自学过程中遗漏了什么?

谢谢

【问题讨论】:

  • 一个非常简单的方法...去打字稿游乐场,在那里上课并检查javascript编译
  • 实际上你不是在创建一个类,而是一个原型,它被“克隆”以获取新实例。
  • @harsha,你听说过静态方法还是类方法?

标签: javascript class instance default


【解决方案1】:

标识符MyClass 是用于创建类实例的函数。作为一个函数也是一个对象(和其他一切一样),它可以具有属性。所以你只需给对象添加一个属性:

MyClass.setDefaultYear = function() { ... };

您还需要在某个地方存储默认年份设置。您可以将其设为 MyClass 对象的成员,或者您可以在创建 setDefaultYear 方法的代码周围放置一个立即执行的函数表达式,以便您可以将默认年份存储在本地变量中。

【讨论】:

    【解决方案2】:

    MyClass 未定义。

    function MyClass(){
        this.setDefaultYear = function(year){
            MyClass.prototype.year = year;
        };
        this.getYear = function (){
            return this.year;
        }
    }
    var var1=new MyClass();
    var1.setDefaultYear("2013"); //sets default year for all instances of MyClass to 2013
    console.log(var1.getYear()); //returns 2013
    var1.year=2001; //sets year to 2001
    console.log(var1.getYear()); //returns 2001
    var var2=new MyClass();
    console.log(var2.getYear()); //returns 2013
    

    【讨论】:

    • 你的例子肯定比我的更简洁。做得好! :-)
    • 这里有一点需要注意,“this.getYear”将为 MyClass 的每个实例创建该函数的一个新实例,而“MyClass.prototype.getYear”将是一个共享函数实例。后者稍微便宜一些,因为每个实例共享一个函数,该函数只返回比实例“年”值(参见我的示例);
    • @series0ne 感谢您的建议。我修改了我的代码,它比以前更好。但我不知道这是否绝对正确。
    • 看看 OP 的要求,在我的回答中考虑这一点,并将我的代码中的代码与您的代码进行比较。我可以立即看到您的回答,这并不是 OP 所要求的。您几乎已经掌握了它,但是操作已指定 setDefaultYear 应该可以静态访问(MyClass.setDefaultYear)。函数行为是准确的,但您是在实例上实现的,而不是静态对象。
    【解决方案3】:

    这完全符合您的要求。

           /* THIS IS THE "CLASS" */
    var MyClass = (function () {
    
        // MyClass is a function that constructs an instance
        function MyClass() { }
    
        //Creates a new function on the prototype to get the year for the instance. functions which are part of the prototype are instance functions that are shared across all instances of the object.
        MyClass.prototype.getYear = function () {
            return this.year;
        }
    
        MyClass.setDefaultYear = function (year) {
            /* The prototype is shared across all instances of MyClass, 
            so all instances receive the same value, unless specified directly on the instance.*/
            MyClass.prototype.year = parseInt(year);
        }
    
    
        // return the full MyClass implementation.
        return MyClass;
    })(); // Your "class" ends here!
    
    // Tests...
    
    var var1 = new MyClass(); // Create a new instance of MyClass
    
    MyClass.setDefaultYear(2013); // Set The default year for ALL instances of MyClass.
    
    alert(var1.getYear()); // This shows "2013" because that is what has been set on the prototype.
    
    var1.year = 2001; //Year is visible, and you can set it's value for each unique instance.
    
    alert(var1.getYear()); // This displays "2001" because that is the value now belonging to instance "var1"
    
    var var2 = new MyClass(); // Create a new instance of MyClass
    
    alert(var2.getYear()); // Since the prototypes value is still 2013, this displays "2013"
    

    【讨论】:

    • 这对我理解有很大帮助,谢谢(以及其他帮助过我的人)。上课! (“你统治”,法语;))
    • 没问题! :-) JavaScript 的原型架构有时是一个奇怪的野兽!
    【解决方案4】:
    function MyClass(){
    // other stuff
    }
    MyClass.setDefaultYear = function(year){
        MyClass.year = year;
    }
    // the rest
    

    【讨论】:

      【解决方案5】:

      简单。将setDefaultYear 视为一个类函数,并在getYear 函数中提供默认值作为后备。

      MyClass.setDefaultYear = function(year) {
        MyClass.defaultYear = year;
      }
      
      MyClass.setDefaultYear("2013");
      
      function MyClass() {
        ....
        ....
        this.year;
        this.getYear = function() {
         return this.year || MyClass.defaultYear; //returns MyClass.defaultYear if this.year is not set.
        };
        this.setYear = function(year) {
         this.year = year;
        };
      }
      
      var myClass = new MyClass();
      myClass.getYear();//"2013"
      myClass.setYear("2015");
      myClass.getYear();//"2015"
      

      【讨论】:

        【解决方案6】:

        我猜你的类是一个名为MyClass 的函数。在 JavaScript 中,函数是对象。因此,您可以通过关键字this 将属性分配给函数。此外,每个自定义函数都将由原型属性扩展。此属性是对虚拟对象的引用。如果您通过关键字 new 创建 MyClass 的新实例,则使用对虚拟对象的引用。您可以通过属性.prototype 扩展您的类/虚拟对象。示例:

        function MyClass(pname)
        {
            this.name = pname;
        }
        
        MyClass.prototype.getName = function()
        {
            alert(this.name);
        }
        
        Obj = new MyClass('Simon');
        Obj.getName(); // alerts Simon
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-12
          • 1970-01-01
          • 2013-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-09
          • 1970-01-01
          相关资源
          最近更新 更多