【问题标题】:How to iterate through instances of a prototype "class" JS如何遍历原型“类”JS的实例
【发布时间】:2018-12-25 11:17:27
【问题描述】:

我想要一个“for”或“while”循环来遍历原型/“类”中的所有实例/对象。 比如数组中的“hasNext()”。

然后我想实现一个功能。例如 alertname("obj") 这将返回 obj 的名称。问题是我不知道具体的 obj。该函数只获取一个字符串,然后它将在原型中搜索哪个是正确的。

   function Product(id, name) {
    this.id = id;
    this.name = name;
}

Product.prototype.getid = function() {
    i = this.id;
    return i;
};
Product.prototype.getname = function() {
    i = this.name;
    return i;
};

balloon = new Product(0, "Balloon");
var text = "balloon";

//doesnt work
function getname(obj) {
    i = Product.prototype.getname(obj);
    window.alert(i);
}
getname(text);

【问题讨论】:

  • 注意:hasNext 在 JS 中不存在;你可能想到了 Java?

标签: javascript prototype javascript-objects


【解决方案1】:

您似乎想要跟踪您使用new Product 创建的所有对象。这是你需要自己实现的东西。

只需创建一个数组:

const stock = [];
stock.push(new Product(0, "Balloon"));
// ...
stock.push(new Product(0, "Monopoly"));

然后你可以简单地迭代它们:

for (const product of stock) {
    console.log(product.getname());
}

JS 没有为您提供这样一个开箱即用的数组是有充分理由的:如果这样做了,那么任何创建的对象都不会被垃圾收集;它们将始终被视为您仍然需要使用的东西。所以没有内置机制来做这件事是件好事。

关于你自己的尝试

Product.prototype.getname(obj);

这没有意义:getname 不接受参数。您通常调用原型函数,如方法:

obj.getname()

在某些情况下,您可能希望使用Product.prototype.getname,但这仅在obj 不是Product 的实例时才需要,但它是如此相似以至于可以调用getname。在这种情况下使用.call():

Product.prototype.getname.call(obj);

【讨论】:

  • 这部分不起作用:for (const product of stock) { console.log(product.getname());第一个错误是;不允许“for”循环中的“of”。第二我把它改成“in”,然后它说 getname() 不是一个函数:for (const product in stock) { window.alert(product.getname()); }
  • 好的,我将其转换为普通的 for 循环: for (var i = 0; i
  • for...of syntax 是在 ES2015 中引入的,所以它已经存在了很长一段时间。除 IE 外的所有浏览器都支持它。你在什么环境下运行?
  • 另外,使用alert 进行调试确实是“未完成”。请改用console.log。控制台提供了很好的方法来检查您的代码和变量并监控执行。
猜你喜欢
  • 2018-08-17
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多