javascript 涉及未知数量参数的构造函数...

javascript constructors involving unknown amounts of arguments...

我在 codecadamy 上弄乱了一些 js,并且在尝试使某些东西起作用时有点偏离了方向。

本质上,我是在创建一些对象,这些对象被加载到控制器对象中,并使用两个函数设置为它的属性,这两个函数打印属性并将字符串与控制器中每个对象的名称 属性 进行比较控制器。

我注意到如果我以原型样式制作对象并指定一个普通函数来处理设置属性,我可以做到这一点:

var friends = {};

friends.setUp = function() {
  this.friends = [];
  for(var i in arguments) {
    arguments[i].setUp();
    this.friends.push(arguments[i]);
  }
};

friends.list = function() {
  for(var i in this.friends) {
    console.log(this.friends[i]);
  }
};

friends.search = function(name) {
  for(var i in this.friends) {
    if(this.friends[i].firstName === name) {
      return this.friends[i];
    }
  }
};

var bill = {};

bill.setUp = function() {
  this.firstName = "Bill";
  this.lastName = "Gates";
  this.number = "(206) 555-5555";
  this.address = ['One Microsoft Way','Redmond','WA','98052'];
};

var steve = {};

steve.setUp = function() {
  this.firstName = "Steve";
  this.lastName = "Jobs";
  this.number = "(206) 555-5555";
  this.address = ['1 Infinite Loop','Cupertino','CA','95014'];
};

var mike = {};

mike.setUp = function() {
  this.firstname = "Mike";
  this.lastname = "Ryd";
  this.number = "(800) 555-5555";
  this.address = ['redacted'];
};

friends.setUp(bill, steve, mike);
friends.list();
var result = friends.search("Steve");
console.log(result);

但是,如果我用构造函数来做它是行不通的,例如:

function bill() {
  this.firstName = "Bill";
  this.lastName = "Gates";
  this.number = "(206) 555-5555";
  this.address = ['One Microsoft Way','Redmond','WA','98052'];
};

function steve() {
  this.firstName = "Steve";
  this.lastName = "Jobs";
  this.number = "(206) 555-5555";
  this.address = ['1 Infinite Loop','Cupertino','CA','95014'];
};

function mike() {
  this.firstname = "Mike";
  this.lastname = "Ryd";
  this.number = "(800) 555-5555";
  this.address = ['redacted'];
};

function friends() {
  this.friends = [];
  for(var i in arguments) {
    this.friends.push(arguments[i]);
  }
};

friends.list = function() {
  for(var i in this.friends) {
    console.log(this.friends[i]);
  }
};

friends.search = function(name) {
  for(var i in this.friends) {
    if(this.friends[i].firstName === name) {
      return this.friends[i];
    }
  }
};

var bill = new bill();
var steve = new steve();
var mike = new mike();
var friends = new friends(bill, steve, mike);
friends.list();
var result = friends.search("Steve");
console.log(result);

我想知道这是使用构造函数的限制还是我在某处弄乱了语法?谢谢!

这似乎与参数数量未知的构造函数没有任何关系,而是您没有适当地为对象分配方法。它们需要放在原型上,以便由该特定构造函数创建的所有对象继承它们。所以在你的代码中,这些:

friends.list = function() {...}
friends.search = function() {...}

需要改为:

friends.prototype.list = function() {...}
friends.prototype.search = function() {...}

像这样:

friends.prototype.list = function() {
  for(var i = 0; i < this.friends.length; i++) {
    console.log(this.friends[i]);
  }
};

friends.prototype.search = function(name) {
  for(var i = 0; i < this.friends.length; i++) {
    if(this.friends[i].firstName === name) {
      return this.friends[i];
    }
  }
};

那么,这段代码应该可以正常工作:

var bill = new bill();
var steve = new steve();
var mike = new mike();
var friends = new friends(bill, steve, mike);
friends.list();
var result = friends.search("Steve");
console.log(result);

然后,代码将按您预期的方式工作:http://jsfiddle.net/jfriend00/ba4me8ua/


仅供参考,您会注意到我更改了遍历 arguments 对象项的方式,使其更像数组,并避免在迭代中获得任何非数字属性的任何机会。