[英]constructor with named parameters?
So I was looking around when I found out that I could make named parameters like this: 因此,当我发现可以像这样创建命名参数时,我环顾四周:
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"
but what about constructors, like this one? 但是像这样的构造函数呢?
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?
Actually, the second section of the code gives me the following error in chrome 49: Uncaught TypeError: foo is not a constructor
. 实际上,代码的第二部分在chrome 49中给了我以下错误: Uncaught TypeError: foo is not a constructor
。
I mean, evidently foo
is a constructor, why cant I just make 81 properties with different name of foos
, all being objects containing an x
, y
, and z
? 我的意思是,显然foo
是构造函数,为什么我不能只用不同的foos
名称创建81个属性,它们都是包含x
, y
和z
?
EDIT 编辑
The code above seems to work allright, but when I try to apply it to bigger code like the following, it just doesn't want to listen: 上面的代码似乎可以正常工作,但是当我尝试将其应用于如下所示的较大代码时,它只是不想听:
$(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>
You have to call the constructor the same way you call the regular function, with an object as the argument. 您必须以与调用常规函数相同的方式来调用构造函数,并以对象作为参数。
var bar = new foo({ x: "x" });
So the for
loop should be: 因此, for
循环应为:
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.