2013-07-26 60 views
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 

非但沒有報警,由於某種原因,我得到這個錯誤:

Uncaught TypeError: Object [object Object] has no method 'test'

+0

你應該使用類作爲變量名? – gezzuzz

+0

只是指出來。 class是JS中的一個保留關鍵字。 YOu可能想要使用別的東西,如clazz – mohkhan

+0

我將類更改爲testClass ..still相同 – Autolycus

回答

0

您必須添加的測試方法的原型初始化的。像這樣...

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

myclass.init.prototype = myclass; 

這樣所有的對象都會繼承自myclass對象。

+0

這個工作,但看起來很錯誤... – bfavaretto

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而不是在構造函數中聲明它們。有關這兩者之間的區別,請參閱Use of 'prototype' vs. 'this' in 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' 
2

另一種實現,有一些解釋:

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

// Any functions need to be added to the prototype, 
// and should use the keyword this to access member fields. 
// Doing this allows for a performance gain over recreating a new function definition 
// every time we create the object, as would be the case with this.test = function() { ... } 
MyClass.prototype.test = function(data){ 
    alert('testing'); 
}; 

// At this point, MyClass is a constructor function with all of it's 
// prototype methods set, ready to be instantiated. 

var testClass = new MyClass(); 
testClass.customer = 'John B'; // May also want to consider moving this into the constructor function as a parameter. 
testClass.test(); 

JSFiddle