简体   繁体   English

具有命名参数的构造函数?

[英]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个属性,它们都是包含xyz

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM