【问题标题】:javascript constructors involving unknown amounts of arguments...涉及未知数量参数的javascript构造函数...
【发布时间】:2015-08-02 15:48:08
【问题描述】:

我在 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);

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

【问题讨论】:

    标签: javascript constructor arguments


    【解决方案1】:

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

    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 对象项的方式,使其更像数组,并避免在迭代中获得任何非数字属性。

    【讨论】:

    • 谢谢!就是这样。有意义,因为函数也是属性,所以如果构造函数仅作为构造函数在它初始化的对象之前存在,那么这些函数在创建之前没有任何附加内容。这样做的一种方式会比另一种方式更受欢迎吗?我发现只制作“setUp”函数并根据需要设置我的属性比制作构造函数效果更好。
    • 构造函数上的变量参数很好。如果派生对象也想要有自己的参数,它确实会使继承变得有点复杂(但即使在这种情况下,它也可以被管理)。但是,我真的不能说.setup()(或通常称为.init())方法比构造函数的参数更好或更坏。无论哪种方式都可以。
    • 但是,您的第一个代码块不允许您创建多个 friends 对象。那只允许一个静态声明的单例对象。您的第二个代码块更灵活。
    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    相关资源
    最近更新 更多