【问题标题】:How to make a javascript class with a constructor method to initiate new objects / instances?如何使用构造方法创建一个 javascript 类来启动新对象/实例?
【发布时间】:2013-10-10 20:10:50
【问题描述】:

我正在尝试使用 javascript。我正在尝试创建一个“类”,但它并没有像它应该的那样工作。我在启动 MyClass 的新实例时遇到问题。请参阅 js 小提琴。是否可以像在 php 中一样向 MyClass 添加构造函数? 我也不确定这是在 javascript 中定义“类”的方式。因此,任何帮助都将不胜感激。

http://jsfiddle.net/kasperfish/JnvFS/

    var MyClass={
        test:'hello',

        hallo: function(){
            alert(this.test);
        },

        setTest: function(x){
            this.test=x;
        }

    }

MyClass.hallo();
MyClass.setTest('world');
MyClass.hallo();

//not working because MyClass is/does not have a constructor
x= new MyClass;//*
x.hallo(); 

* firebug: TypeError: MyClass is not a constructor

【问题讨论】:

标签: javascript oop constructor


【解决方案1】:

好的,首先你应该知道javascript没有“类”,javascript数据结构确实是由对象组成的,但从上面的代码中可以看出,对象本质上是键值对,与php等其他语言非常不同,在javascript中OOP的实现是非常不同的。

如果您想使用构造函数来创建对象的实例,请尝试使用函数、构造函数来创建“类”,可能是这样:

function MyClass(){
    this.test ='hello';
    this.hallo = function(){
                     alert(this.test);
                 };

    this.setTest = function(x){
                       this.test=x;
                   };
}

var myClassInstance = new MyClass();
myClassInstance.hallo();
myClassInstance.setTest('world');
myClassInstance.hallo();

希望对你有帮助

【讨论】:

  • 在构造函数中设置可重用函数而不是将它们附加到原型上有点内存效率低下,因为每个新实例都会被分配新的hallosetTest 函数。
  • @jon Koops:感谢您的评论。我想知道如果我可以在“类”本身中编写我的函数,为什么我应该使用原型。 (at) kamikazeOvrld 也感谢您的回答。
  • @kasperTaeymans 没问题,很高兴为您提供帮助。使用原型本质上是说'我希望这个属性在这个对象的所有实例上都可用,当然还有对象本身'。
  • 也许是这个非常规的中间地带:function MyClass() { if (!MyClass.prototype.aMethod) { MyClass.prototype.aMethod = function() {} } }
  • @kamikazeOvrld 这也是一种选择,但比我认为的要冗长得多。最后,这是一个偏好问题。
【解决方案2】:

你必须让你的 MyClass 对象变成这样的函数:

var MyClass = function() {
    this.test = 'Hello';
};

MyClass.prototype.hello = function() {
    alert(this.test);
};

MyClass.prototype.setTest = function( x ) {
    this.test = x;
};

var myInstance = new MyClass();

myInstance.hello();
myInstance.setTest('World');
myInstance.hello();

【讨论】:

    【解决方案3】:

    在 JavaScript 中,类的构造函数只是一个函数,其成员要么在其中设置,要么使用prototype 对象设置。例如:

    function MyClass(someArgument) {
       // construction, init members of this
       this.someField = someArgument;
       this.test = 'a test';
    }
    
    // in addition, all members of `prototype` are automatically set on every 
    // new instance of MyClass.
    MyClass.prototype.hallo = function(){
             alert(this.test);
    };
    

    然后

    var inst = new MyClass(42);
    inst.hallo();
    

    我建议您阅读 JavaScript 中基于原型的 OOP。它绝对不同于您可能习惯于 PHP 的那种,而且通常感觉不是很直观。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多