0
var myclass = {
    init:function () {
        this.customer = null;
    },
    test : function(data){
      alert(testing);
    }
};

上記のようにインスタンス化していますが、後でクラスmyclassのメソッドを呼び出そうとしていますが、うまくいきません。test私は何を間違っていますか?

var testClass = new myclass.init();
testClass.customer = 'John B';
testClass.test(); //doesnt alert 1

アラートを受け取る代わりに、何らかの理由で次のエラーが発生します。

キャッチされていない TypeError: オブジェクト [オブジェクト オブジェクト] にメソッド 'test' がありません

4

3 に答える 3

4

オブジェクトリテラルではなく、コンストラクター関数として「クラス」を定義する必要があります。

var MyClass = function(){
    this.init = function () {
        this.customer = null;
    };

    this.test = function(data){
      alert('testing');
    };
};
var testClass = new MyClass();
testClass.init();
testClass.customer = 'John B';
testClass.test(); //alerts 'testing'

次に、init関数は実際には必要ありません。そのロジックをコンストラクター自体に追加できます。

var MyClass = function(){
    this.customer = null;

    this.test = function(data){
      alert('testing');
    };
};
var testClass = new MyClass();
testClass.customer = 'John B';
testClass.test(); //alerts 'testing'

MyClass.prototypeコンストラクター内でメソッドを宣言する代わりに、メソッドを追加することもできます。この 2 つの違いについては、JavaScript で「プロトタイプ」と「これ」を使用しますか? を参照してください。.

最後に、オブジェクト リテラルに固執する場合は、次を使用する必要がありますObject.create

var myclass = {
    init:function () {
        this.customer = null;
    },
    test : function(data){
      alert('testing');
    }
};

var testClass = Object.create(myclass);
testClass.customer = 'John B';
testClass.test(); //alerts 'testing'
于 2013-07-26T21:37:15.383 に答える