2013-03-19 136 views
16

所以我設計了一個檔次書界面的新實例,我已經定義了一個療程爲:的JavaScript創建對象

<script> 
course = new Object(); 
var name; 
var gradingareas; 
var finalgrade; 
</script> 

再後來我想創建一個新的實例:

var gradingareas = new Array("Homework", "Classwork", "Exams"); 

course1 = new course("CS1500", gradingareas, 85); 

我也嘗試過沒有前面的變種無濟於事。我得到一個「Uncaught TypeError:對象不是函數」我對JavaScript很陌生,所以我甚至不知道我是否正確地使用這個方法。任何幫助表示讚賞謝謝。

+0

它是JavaScript,而不是「Java腳本」。 – 2013-03-19 16:42:43

+1

請先閱讀此處的基礎知識:https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects。 – VisioN 2013-03-19 16:43:17

回答

40

現有代碼:

// Creates a new, empty object, as a global 
course = new Object(); 
// Creates three new variables in the global scope. 
var name; 
var gradingareas; 
var finalgrade; 

有變量和物體之間沒有任何聯繫。

它看起來像你想要的東西更像:

function Course(name, gradingareas, finalgrade) { 
    this.name = name; 
    this.gradingareas = gradingareas; 
    this.finalgrade = finalgrade; 
} 

然後:

var course1 = new Course("CS1500", gradingareas, 85); 

注意使用大寫字母命名的構造函數。這是JS社區的慣例。

+0

那麼我將如何引用用該函數創建的課程的字段?這個想法是我想保持這些像在java中的類的實例。 – user1991562 2013-03-19 16:46:22

+0

'course1.name'等 – Quentin 2013-03-19 16:49:17

+0

謝謝您的解釋!你救了我。我失去了幾個小時試圖修復一個bug,問題是我不明白JavaScript的oo結構。 – 2016-02-25 21:52:08

32

JS是原型的,而不是基於類的,如果你對它有所瞭解,立即學習它有好處,而不是試圖從它那裏挖掘經典的繼承模型,然而,古典繼承在JS中仍然存在。

總之,要回答你將如何訪問您的變量:

course1.name正常工作與上面的例子。

如果你想私有化你的數據,你可以使用封採取這種做法:

var Course = function(name, grade) { 
    // Private data 
    var private = { 
    name: name, 
    grade: grade 
    } 

    // Expose public API 
    return { 
    get: function(prop) { 
     if (private.hasOwnProperty(prop)) { 
     return private[ prop ]; 
     } 
    } 
    } 
}; 

然後實例化一個新的對象:

var course = new Course('Programming with JavaScript', 'A');

,並開始使用所有私人數據:

course.get('name');

當然,您可能也希望製作人員操縱該數據;)

+4

即使兩個答案都是正確的,但這個答案比我接受的答案更有意義。 – carbontwelve 2015-01-07 21:25:02