2017-05-24 104 views
2

我想通過這個簡單的測試賦值和我有麻煩搞清楚如何適合它的構造函數,如何使一個在Javascript中使用函數的對象構造函數?

describe("Student", function(){ 
    var student; 

    beforeEach(function(){ 
    student = new Student({firstName: "Lysette", scores: [100, 100, 100, 4, 100]}); 
    }); 

    describe("name", function() { 
    it("has a first name", function() { 
     expect(student.firstName).toEqual("Lysette"); 
    }); 
    }); 

我已經試過這一點,但它似乎沒有要工作:

var Student = function (firstName, scores){ 
    this.firstName = firstName; 
    this.scores = scores; 
}; 

任何解決方案?

+0

什麼喲由意味着「似乎並不奏效」? –

+3

您正在傳遞包含兩個屬性「firstName」和「scores」的對象,而不是兩個單獨的參數。你想要哪些行爲? –

+0

這與構造函數的功能有什麼關係? – Bergi

回答

0

您可以使用參數解構(ES6):

var Student = function ({firstName, scores}){ 
    this.firstName = firstName; 
    this.scores = scores; 
}; 

利用這一點,你可以指定firstName和成績。

還是老的,但防彈,並指派了所有propertys:

var Student = function (changes){ 
Object.assign(this,changes); 
}; 

所以,你可以這樣做:

new Student({test:true,name:"test"}); 

或者,如果你希望你的原代碼,你可能有不同的稱呼它:

new Student("Jeff",[0,1,1]); 

由於您期望兩個參數在你的函數中...

+1

我知道這是正確的,但我覺得我們在作弊...... – evolutionxbox

+1

第一個對我最有意義,謝謝! – CarlosG90

+0

@ CarlosG90其實我認爲secons one是最適合你的。請在使用第一個之前閱讀https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Destrukturierende_Zuweisung ... –

0

因爲函數是JavaScript中的第一類對象(What is meant by 'first class object'?),所以它們可以像對象一樣傳遞。這與您可能使用回調的方式類似。

function Student(name, functionToBeCalledWhenCreated) // Constructor{ 
    this.name = name; 
    functionToBeCalledWhenCreated(name); 
} 
function sayStudentsName(name){ 
    console.log("This student's name is " + name); 
} 

var glen = new Student("Glen", console.log); //don't include parenthesis on the function or it will call the function 
var owen = new Student("Owen", sayStudentsName); 
+1

您需要使用'new'關鍵字:var glen = new Student(「格倫「,console.log) –

+0

謝謝餘下。 –

0

您可以構建學生是這樣的:

function Student(fields){ 
    this.firstName = fields.firstName; 
    ....... 
} 
0

也許你可以嘗試這樣的事:

class Student 
{ 
    constructor(firstName, scores) 
    { 
    this.firstName = firstName; 
    this.scores = scores; 
    } 
} 
var student = new Student('Lysette', [100, 100, 100, 4, 100]); 
alert('Name : '+student.firstName+ ' | Scores : '+ student.scores); 
+0

這只是OP所做的語法糖。 – 4castle

相關問題