Javascript 使用对象属性进行迭代

Javascript 使用对象属性进行迭代,javascript,object,properties,iteration,enumerable,Javascript,Object,Properties,Iteration,Enumerable,可以在JavaScript中使用对象属性进行“for in”迭代吗 我想写一个像这样的袋子类: var Bag = function () { this.elements = {}; } Bag.prototype.add = function (key, value) { this.elements[key] = value; }; // other methods ... 现在我想在for-in迭代中使用此类的对象: for (var key in myBag) { con

可以在JavaScript中使用对象属性进行“for in”迭代吗

我想写一个像这样的袋子类:

var Bag = function () {
  this.elements = {};
}

Bag.prototype.add = function (key, value) {
  this.elements[key] = value;
};

// other methods ...
现在我想在for-in迭代中使用此类的对象:

for (var key in myBag) {
  console.log(myBag[key]); // or myBag.get(key);
}

在myBag.getAll()中没有像var key这样的助手方法也可以做到这一点。

您可以将键/值对添加到实例本身,并将该方法创建为不可枚举的,例如:

function Bag() {
}

Object.defineProperty(Bag.prototype, 'add', {
  enumerable: false,
  value: function(k, v) {
    this[k] = v
  }
})

var bag = new Bag
bag.add('a',1)
bag.add('b',2)
bag.add('c',3)

for (var k in bag)
  console.log(k)
//^ a
//  b
//  c
请注意,您也可以正常声明该方法,并始终使用
hasOwnProperty
check循环:

for (var k in bag)
  if (bag.hasOwnProperty(k))
    console.log(k)
或另一种选择:

Object.keys(bag).forEach(function(k) {
  console.log(k)
})

类似的例子是
forEach
,但您可以制作
映射
过滤器
或任何东西

Javascript

(function () {
    'use strict';

    function Bag() {
        this.elements = {};
    }

    Bag.prototype = {
        add: function (key, value) {
            this.elements[key] = value;
        },

        forEach: function (fn, thisArg) {
            Object.keys(this.elements).forEach(function (key) {
                fn.call(thisArg, this[key], key, this);
            }, this.elements);
        }
    };


    var myBag = new Bag();

    myBag.add('one', 1);
    myBag.add('two', 2);
    myBag.add('three', 3);

    myBag.forEach(function (item, key, object) {
        console.log(this, item, key, object);
    }, 'hello');
}());
输出

hello 1 one Object {one: 1, two: 2, three: 3}
hello 2 two Object {one: 1, two: 2, three: 3}
hello 3 three Object {one: 1, two: 2, three: 3}

关于(myBag.elements中的var键)

。但如果可能的话,我更喜欢不使用“.elements”的解决方案。this.elements[key]将等同于this.elements.key(如果该键存在),因为您将元素定义为对象。。如果元素是数组。按如下方式分配:this.elements=[];在add中使用this.elements.push({“key”:key,“val”:value});等待您是否试图公开、分配和迭代对象myBag实例的属性/成员?我只想迭代对象myBag的一个属性中的所有属性。灵感来自java等语言的枚举接口。这很有趣。。也许你可以把这个答案和本问答中提到的答案结合起来。。。好主意,不幸的是“添加”不可分配;)如果没有人有更好的想法,我想使用这个模式。