1

我被要求根据以下代码创建一个 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"而不是实例名称。

我在自学过程中错过了什么?

谢谢

4

6 回答 6

1

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

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

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

于 2013-06-07T09:21:34.817 回答
1

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
于 2013-06-07T09:45:43.357 回答
0
function MyClass(){
// other stuff
}
MyClass.setDefaultYear = function(year){
    MyClass.year = year;
}
// the rest
于 2013-06-07T09:22:10.040 回答
0

简单的。将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"
于 2013-06-07T09:25:47.173 回答
0

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

function MyClass(pname)
{
    this.name = pname;
}

MyClass.prototype.getName = function()
{
    alert(this.name);
}

Obj = new MyClass('Simon');
Obj.getName(); // alerts Simon
于 2013-06-07T09:46:57.047 回答
0

这正是您所要求的。

       /* 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"
于 2013-06-07T10:15:32.453 回答