2013-01-09 8 views
5

JavaScriptのObjectの.lengthプロパティをオーバーライドする方法を探しています。 (Function.lengthをオーバーライドして厳密なモードで配列の長さを返す方法

私は現在

これは基本的な構造である(親コードは、コンテキストに読みやすくなるようにするために使用される)parent.properties.objectsアレイ上のラッパーを有します親変数は、名前空間で定義されていて、intialized)

var parent = function() { 
    this.properties = { 
    objects: []; 
    }; 
}; 

ラッパー

されます引数が渡されない場合
(function() { 
    "use strict"; 

    objects = function() { 

if (arguments.length === 0) { 
    var _objects = parent.properties.objects; 
    return _objects; 

変更またはフィルタ

} else if (arguments.length > 0) { 
     ... 
    } 
    }; 

これは(のObject.prototype(ない[プロトタイプ])変数を作成し、メソッドの長さを追加するオブジェクトを取得仮定)

objects.prototype.length = function() { 
    var length = parent.properties.objects.length; 
    return length; 
    } 

エラー

私が正しくあなたの質問を理解してきたと仮定すると、
objects.prototype.__proto__.length = function() {  
    var length = parent.properties.objects.length; 
    return length; 
    } 

    parent.objects = objects; 
})(); 
+0

エラーの種類について詳しく知ることができますか? – guypursey

+0

私はobjects.Length()(JavaScriptは大文字と小文字を区別します)でハッキングしました。 私は、快適なAPIを作成し、すべてのプロパティ取得/設定操作に関数を持たないようにしています。すべてのプロパティに対して単一の関数です。 objects.length()を呼び出すのは良いことでしたが、objects().length()とは対照的にobjects.Length()が行います。エラーは何らかの__proto__が見つかりませんでした。 ECMA 6を待たなければなりません。 –

+0

最後の行 'parent.object = object;'は何をすべきでしょうか? 'parent'は関数であり、' object'変数はどこにでも宣言されていません。 – Bergi

答えて

3

、次のコードはあなたを助けるかもしれない:

function MyObject() { 
    this.myActualData = []; 
} 

Object.defineProperty(MyObject.prototype, 'length', {get: function() { 
    return this.myActualData.length; 
}}); 

そして、ここでは、使用中のそれの例です:

var x = new MyObject(); 
x.myActualData.push("Hello"); 
x.myActualData.push("World"); 
x.length; // is 2 

注:これはのみ動作しますecmascript 5以上のブラウザで表示されます。

+0

ページロード中にオブジェクトとその名前が作成されている場合のように、未知のオブジェクトの名前(MyObject)でどのように動作させることができますか? –

+0

私はあなたの質問を完全に理解しているかどうかは分かりませんが、プロトタイプだけでなく、どのオブジェクトでもObject.definePropertyコールを実行できます。 – kybernetikos

関連する問題