1

このコードの何が問題になっていますか? クラス foo をすべてのネイティブ配列の関数で拡張しようとしています。

function foo(){
    Array.call(this);
 }

foo.prototype.addFruit=function(item){
    this.unshift(item);
}
foo.prototype=new Array();
foo.prototype.constructor=foo;

var c =new foo();

c.addFruit('Apple');


document.write(c.join('-'));
​
4

2 に答える 2

2

でプロパティaddFruit全体を上書きする前に、プロパティをプロトタイプに追加します。prototypenew Array

の代わりにnew Array、 を使用Object.create(Array.prototype)して、実際の Arrayインスタンスをプロトタイプとして (lengthなどを使用して) 持たず、Array プロトタイプから継承したオブジェクトのみを持つようにする必要があります。

Array.call(this)残念ながら動作しません。何も割り当てられていない新しい配列を返しますが、 では何もしませんthis。で確認できますthis !== Array.call(this)。実際には、「サブクラス化」することはできません- http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-arrayArrayを読んでください

于 2012-10-26T05:55:33.847 に答える
2

addFruitメソッドをprototypeofに追加してから、 thefooを上書きしたfoo.prototypeため、メソッドが欠落しています (元のプロトタイプにメソッドを追加した後、プロトタイプが別のオブジェクトに変更されました)。

prototypeコードの順序を変更し、 before add メソッドを に割り当てる必要がありますprototype

foo.prototype=new Array();
foo.prototype.constructor=foo;

foo.prototype.addFruit=function(item){
    this.unshift(item);
};
于 2012-10-26T05:47:11.137 に答える