2015-07-02 81 views
6

首先,對於我缺乏術語感到抱歉。從構造函數循環遍歷每個新對象

如果我有一個構造

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 
} 

,我從中做幾個對象

var One = new myObject("One", 1); 
var Two = new myObject("Two", 2); 

我可以通過從myObject類所做的每一個新的對象循環,沒有把每一個新的對象到數組?


是否可以將即時調用函數添加到將對象添加到數組中的構造函數中?

例如

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 

    this.addToArray = function(){ 
     theArray.push(this);  // this is the IIFE 
    }(); 
} 

這種方式創建的任何新對象立即運行此函數並將其添加到數組中。

這可能嗎? (當前的語法不工作,很明顯)


編輯說回這一年後,我可以告訴你,這是可能的。你只需要調用構造函數中的功能,像這樣:

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 

    this.addToArray = function(){ 
     theArray.push(this); 
    }; 

    this.addToArray(); 

} 

以下是這的jsfiddle一個例子,互推異物塞入實例化一個數組,然後直接從陣列中調用每個對象的.speak()方法。

https://jsfiddle.net/Panomosh/8bpmrso1/

+0

是Object.keys(One);你需要什麼? –

+0

你不能,沒有什麼保留對你的對象的引用。 – Hacketo

+0

基本上我希望能夠看到我從myObject構造函數創建的每個對象。 –

回答

1

不使用數組,你不能,這是不是意味着要使用的方式。

你可以做的,雖然是什麼,是看守在myObject

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 

    this.watch(); 
} 

myObject.prototype.watch = function() { 
    if (myObject.instances.indexOf(this) === -1) { 
     myObject.instances.push(this); 
    } 
}; 

myObject.prototype.unwatch = function() { 
    myObject.instances.splice(myObject.instances.indexOf(this), 1); 
}; 

myObject.instances = []; 
+0

它們可能不存在在窗口的某個地方。 –

+1

@JoshStevenson只有全局變量。 – Hacketo

+0

看我的編輯,這可能嗎?我覺得這應該是一件很容易實現的事情,但事實證明它不是! –

1

沒有的靜態成員創建的每個實例,你不能。幾乎所有的編程語言都無法做到這一點。

您可以在構造函數中將每個創建的對象的引用存儲到數組/映射中,以便您可以隨時對它們進行迭代。然而,這樣可以防止這個類的所有對象被垃圾收集,因此小心使用它。

JavaScript中的WeakMap只保留了一週的密鑰引用,但它反過來又不允許您遍歷所有密鑰。所以它也不是一個選項。

+1

也很好的注意到'WeakMap'是一個ES6功能 – axelduch

+0

如果你真的確定你想這樣做,那麼你可以保留一個WeakMap的鍵數組並循環。 – serg10

+0

然後這個額外的數組將保留這些對象,從而擊敗'WeakMap'的整個目的。我之所以提到「WeakMap」解決方案,是因爲您可以用編程語言實現相同的功能,因爲編程語言支持可以迭代的真正的弱映射。 –

0
var MyClass = (function() { 
    var _instances = []; 

    function MyClass(name, value) { 
    _instances.push(this); 

    this.name = name; 
    this.value = value; 
    } 

    MyClass.each = function(cb) { 
    for (var i in _instances) { 
     if (_instances.hasOwnProperty(i)) { 
     cb(_instances[i]); 
     } 
    } 
    } 

    return MyClass; 

})(); 

new MyClass('John', 10); 
new MyClass('James', 20); 

MyClass.each(function(item) { 
    console.log(item); 
});