2011-10-08 4 views
0
function StringStream() {} 
StringStream.prototype = new Array(); 
StringStream.prototype.toString = function(){ return this.join(''); }; 

Appel new StringStream(1,2,3) donne un tableau videhéritage Trivial avec JavaScript

x = new StringStream(1,2,3) 

donne

StringStream[0] 
__proto__: Array[0] 

Quelqu'un peut-il s'il vous plaît expliquer pourquoi le constructeur superclasse (Array) n'est pas appelé?

+0

qui vous a donné ce code et pourquoi? :( – c69

Répondre

2

Tout simplement parce que StringStream.prototype est un tableau, le constructeur StringStream n'est pas remplacé par Array.

Vous devez l'implémenter vous-même: http://jsfiddle.net/gBrtf/.

function StringStream() { 
    // push arguments as elements to this instance 
    Array.prototype.push.apply(this, arguments); 
} 

StringStream.prototype = new Array; 

StringStream.prototype.toString = function(){ 
    return this.join(''); 
}; 
+0

Donc il n'y a aucun moyen d'appeler le constructeur de Array obj et passer les arguments au lieu d'invoquer la méthode push –

+0

@Markos Evlogimenos: Vous ne pouvez pas combiner 'new' et' .apply' donc je suppose qu'il n'y a aucun moyen. Quoi qu'il en soit, pourquoi essayez-vous de créer un constructeur équivalent à 'Array'? – pimvdb

+0

c'était juste un exemple de code pour un problème plus important :) –