2016-04-14 13 views
0

So war ich umsah, als ich herausfand, dass ich so benannte Parameter machen könnte:Konstruktor mit benannten Parametern?

function boo({first = "one", second = "two"} = {}) { 
    console.log(first + second); 
} 

// and then calling it 

boo({first = "two", second = "five"}); // logs "twofive" 
boo({first = "two"}); // logs "twotwo" 
boo({second = "five"}); // logs "onefive" 
boo(); // logs "onetwo" 

aber was Konstrukteuren, wie dieser?

function foo({x, y = "y", z = "z"} = {}) { 
    this.x = x; 
    this.y = y; 
    this.z = z; 
} 

var bar = new foo("x"); 

console.log(bar); 

// up until now, it works! 

var rows = ["a","b","c","d","e","f","g","h","i"]; 
var cols = ["a","b","c","d","e","f","g","h","i"]; 

var foos = {}; 

for(let i = 0; i < rows.length; i++) { // make rows 
    for(let j = 0; j < cols.length; j++) { 
     let counter = rows[i] + cols[j]; 
     foos[counter] = new foo({x: counter}); 
    } 
} 

// this doesn't work for some reason? 

gibt Eigentlich mir den zweiten Abschnitt des Codes die folgenden Fehler in Chrom 49: Uncaught TypeError: foo is not a constructor.

Ich meine, offenbar foo ist ein Konstruktor, warum kann ich nur 81 Objekte mit unterschiedlichen Namen zu machen von foos, alle sind Objekte enthält eine x, y und z?

EDIT

Der obige Code scheint allright zu arbeiten, aber wenn ich versuche, es wie folgt aus, um größeren Code anzuwenden, es will einfach nicht hören:

$(function() { 
 

 
    function cell({ 
 
    coords, building = "none", terrain = "soft", temperature = "25°C", humidity = "none", population = "0", money = "$0", income = "$0", production_amount = "0", production_type = "none", corruption_level = "0%", owner = "none" 
 
    } = {}) { 
 
    this.coords = coords; 
 
    this.building = building; 
 
    this.terrain = terrain; 
 
    this.temperature = temperature; 
 
    this.humidity = humidity; 
 
    this.population = population; 
 
    this.money = money; 
 
    this.income = income; 
 
    this.production_amount = production_amount; 
 
    this.production_type = production_type; 
 
    this.corruption_level = corruption_level; 
 
    this.owner = owner; 
 
    } 
 

 
    // var cella = new cell("aa"); 
 
    // 
 
    // console.log(cella); 
 

 
    var rows = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]; 
 
    var cols = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]; 
 

 
    var cells = {}; 
 

 
    for (let i = 0; i < rows.length; i++) { // make rows 
 
    for (let j = 0; j < cols.length; j++) { 
 
     let coords = rows[i] + cols[j]; 
 
     let cell = "<div class=\"cell\" id=\"" + coords + "\"></div>"; 
 
     $("main").append(cell); 
 
     cells[coords] = new cell({ 
 
     coords: coords 
 
     }); 
 
    } 
 
    } 
 

 
    $("div.cell").click(function() { 
 
    console.log(this.id); 
 
    }); 
 

 
});
body { 
 
    margin: 0; 
 
} 
 
main { 
 
    width: 100vw; 
 
    height: 100vh; 
 
} 
 
main div.cell { 
 
    width: calc(100vw/9); 
 
    height: calc(100vh/9); 
 
    background-color: #9E1023; 
 
    /*border: solid 1px black;*/ 
 
    float: left; 
 
} 
 
main div.cell:hover { 
 
    background-color: #740B20; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!doctype html> 
 
<html lang="en"> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>Evalitia</title> 
 
</head> 
 

 
<body> 
 
    <main></main> 
 
</body> 
 

 
</html>

enter image description here enter image description here

+0

Ich glaube nicht, 'bar' ist, was Sie es nicht zu erwarten. Vielleicht wollten Sie 'new foo ({x:" x "})'? – Bergi

+1

Sind Sie sicher, dass die Anrufe im ersten Codeblock korrekt sind? Ich bekomme einen Syntaxfehler, ich muss 'boo ({first:" two ", second:" five "}) schreiben; ' – Barmar

+0

@Cory, ja, danke fürs Hinzeigen, Tippfehler –

Antwort

1

Sie müssen den Konstruktor auf die gleiche Weise aufrufen, wie Sie die reguläre Funktion mit einem Objekt als Argument aufrufen.

var bar = new foo({ x: "x" }); 

So ist die for Schleife sollte sein:

function foo({ x, y = "y", z = "z" } = {}) { 
 
    this.x = x; 
 
    this.y = y; 
 
    this.z = z; 
 
} 
 
var rows = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]; 
 
var cols = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]; 
 

 
var foos = {}; 
 

 
for (let i = 0; i < rows.length; i++) { // make rows 
 
    for (let j = 0; j < cols.length; j++) { 
 
    let counter = rows[i] + cols[j]; 
 
    foos[counter] = new foo({ 
 
     x: counter 
 
    }); 
 
    } 
 
} 
 

 
document.getElementById('result').innerHTML = JSON.stringify(foos, null, 1);
<div id="result"></div>

+0

Haben Sie es versucht? Ich habe gerade und ich bekomme den gleichen Fehler –

+0

Ja, ich habe es versucht und habe keinen Fehler. Klicken Sie auf Code-Snippet ausführen und sehen Sie. – Barmar

+0

Entschuldigung für die Unannehmlichkeiten, funktioniert der Dummy-Code, den ich schrieb, aber wenn ich versuche, es auf ein größeres Konzept (nur mehr Variablen) anzuwenden, funktioniert es nicht mehr –

Verwandte Themen