1

Object-Oriented JavaScript book からの質問: Array() が存在せず、配列リテラル表記も存在しないと想像してください。可能な限り Array() に近い動作をする MyArray() というコンストラクターを作成します。

自分のスキルを試す良いチャレンジになると思いました。これは私が思いついたものですが、機能せず、非常に不完全です..私は少し困惑しています:

function MyArray(){

// PRIVATE FIELDS -----------------------

var initialData = arguments;
var storage;

// PRIVATE METHODS ----------------------

function refresh(){ //this doesn't work :(
    for(var i = 0; i < storage.length; i++){
        this[i] = storage[i]
    }
};

function initialize(){
    storage = initialData;
    refresh();
}

function count(){
    var result = 0;
    for(var item in this){
        //console.log(item, parseInt(item), typeof item);
        if(typeof item == 'number'){
            result++;
        }
    }
    return result;
};

initialize();

// PUBLIC FIELDS -------------------------

this.length = count();

// PUBLIC METHODS ------------------------

//todo:
this.push = function(item){
    refresh();
}

this.pop = function(){}

this.join = function(){}

this.toString = function(){}

}

var c = new MyArray(32,132,11);

console.log(c, c.length);

これは、本番コードやプロジェクトのためのものではありません.. JavaScript をもっと学ぼうとするだけです。誰かがこのコードで私を助けようとすることができますか?

4

4 に答える 4

2

重要なのは、argumentsオブジェクトを使用できるということです。これはArray()で作成された配列ではないため、演習のルールに違反することはありません。これがあなたがする必要があることです:

this.length = 0;
for (var i in arguments) {
   this[this.length] = arguments[i];
   this.length++;
}

すべてのオブジェクトが連想配列であることを忘れました。したがって、Array()オブジェクト自体を使用しないため、演習に連想配列を適用することは間違いではありません。

質問の作成者:あなたの例では、次を使用します:this ["i"] =storage[i]これはthis.i=storage[ i]と同じです。引用符を削除して、次のように使用してください[i] = storage [i]

于 2012-07-03T09:32:39.627 に答える
0
for(var item in this){
    if(typeof item == 'number')

プロパティ名は常に文字列です。0 から MaxArrayLength までの数値の文字列表現であるかどうかを確認する必要があります。たとえば、次のことができます

for (var i=0; i<4294967296; i++)
    if (i in this)
         result = i;

これらの 記事配列の動作に関する公式仕様にも興味があるかもしれません。

于 2012-07-02T21:04:42.313 に答える