0

別のjsファイルに記述されるJavaScriptのオブジェクトクラスが必要です。

このオブジェクト クラスはPagesと呼ばれます。

このオブジェクト クラスの目的は、純粋に読み取り専用である html5 の files プロパティを操作することです。

http://help.dottoro.com/ljslrhdh.phpを参照してください。

ページに次のプロパティ/関数が必要です

  • Pages.length : 読み取り専用プロパティです。
  • Pages.add( key , value ) : 連想配列のような加算を行う関数です
  • Pages.getByKey( key ) : キーに関連付けられた値を返す関数です。
  • Pages.getByIndex( index ) : インデックスに関連付けられた値を返す関数です
  • Pages.removeAll() : すべてのキーと値のペアを削除する関数であるため、長さはゼロになります。
  • Pages.removeByKey( key ) : 対応するキーと値のペアを削除する関数です
  • Pages.removeByIndex( index ) : 対応するキーと値のペアを削除する関数です
  • コンストラクター
  • Pages.createFrom( files ) : 上記のリンクに記載されているように、 files オブジェクトに基づいて自動的に作成される Pages オブジェクトのインスタンスを返します。
  • Pages.indexExists( index ) : そのようなインデックスがある場合はブール値を返します
  • Pages.keyExists( key ) : そのようなキーと値のペアが存在する場合、bookean を返します

最も重要な特徴は次のとおりです。

  1. 新しいキーと値のペアを追加するたびに、Pages オブジェクトの末尾に追加されます。
  2. キーと値のペアは、.getByKey( key ) を使用したキーまたは .getByIndex( index ) のいずれかによってアクセスできます。たとえば、最初のキーと値のペアはインデックス 0 でアクセスできます。
  3. 既存のキーと値のペアが削除または追加されるたびに、長さプロパティが更新され、インデックスも更新されます。たとえば、5 つのキーと値のペアがあり、2 番目のペアを削除すると、インデックス 1 を使用して 3 番目のキーと値のペアにアクセスできるようになります。

さまざまな機能のコードは必要ありません。

上記のカスタム オブジェクト クラスを JavaScript で作成するスケルトン構造が必要なだけです。

JavaScript オブジェクトの Set length プロパティを読み、関数として実行する必要があると考えました。

しかし、その後、 Object.create の使用についてhttps://stackoverflow.com/a/6412732/80353https://stackoverflow.com/a/6412869/80353のようなさまざまな改善を示唆するいくつかの回答を見ました。

必要に応じて新しい機能を追加できるように、今後も最適なテンプレートを求めています。

4

1 に答える 1

1

これは私が以前に使用した構造の必要最小限のものです。最新のブラウザーでのみテストしましたが、問題を引き起こすような手法は使用していません。唯一の競合は、Array を使用してオブジェクトのプロトタイピングを行うことです。しかし、これが古いブラウザーで機能しない理由がわかりません。

<script>
  "use strict";

  var ArrayLike = (function(){
    /// create a static reference to our constructor so that we can
    /// add methods to ArrayLike... if we like.
    var _static = function(){
      /// store some "private" values, and arrayify our arguments
      var _args = Array.prototype.slice.call( arguments ),
          _private = { byKey:{}, byIndex:{} }, 
          _public = this;
      /// make sure the user used the 'new' keyword.
      if ( _public instanceof _static ) {
        /// if we have arguments then push them onto ourselves
        if ( _args.length ) {
          _public.splice.apply(_public,[0,0].concat(_args));
        }
        /// Now that a new instance has been created, switch in an array 
        /// prototype ready for the next instance.
        _static.prototype = new Array();
        /// start adding our methods, bare in mind if you wish to
        /// stop any of the native array methods from working you'll 
        /// have to override them here.
        _public.add = function( key, value ){
          /// store the keys and indexes as references to themselves.
          _private.byKey[key] = _public.length;
          _private.byIndex[_public.length] = key;
          /// use the inherited push function from the array.
          _public.push( value );
        }
        /// an example function to show how get by key would work.
        _public.getByKey = function(key){
          if ( (key = _private.byKey[key]) || key === 0 ) {
            return _public[key] ? _public[key] : null;
          }
        }
        /// easy removeAll thanks to the array prototype.
        _public.removeAll = function(){
          _public.length = 0;
        }
        /// here I leave you to flesh out the methods that you 'want'.
        _public.removeByKey = function(){

        }
        /// I'll give you a clue that keeping your array index in order
        /// is going to be a manual process, so whenever you delete you
        /// will have to reindex.
        _private.reIndex = function(){

        }
      }
    }
    /// set-up the prototype as an array ready for creation
    _static.prototype = new Array();
    /// return the function that will be our constructor
    return _static;
  })();

</script>

上記は、通常のコンストラクターの観点からは少し奇妙です。これは、プロトタイプを常に変更しているためです。これは、次のものが期待どおりに機能しないことを意味します。

var a = new ArrayLike(1,2,3);
alert( a instanceof ArrayLike ); /// alerts FALSE

配列から拡張する利点は明らかですが、現在aは任意の配列のように扱うことができるため、一部の作業はコア JS コードによって行われます。ただし、キーを使用するシステムを実装しているため、構造内で使用されているキーを適切に追跡できるように、通常の配列操作のほとんどをオーバーライドするのが最善の場合があります。

とにかく、お役に立てば幸いです。上記のセットアップ方法で簡単にできるはずなので、配列の再インデックスの少しトリッキーな要素を解決するために残しました。

その他の機能強化

特定のプロパティを読み取り専用に設定することに関しては、これは JavaScript 1.8+ でのみ可能です。そのため、古いブラウザーとの下位互換性はありません。Object.defineProperty(obj, prop, descriptor)Felix Kling のコメントで述べたように、これを実現できます。.lengthこれを使用すると、次のようなものに影響を与えて読み取り専用にすることができるはずです。ただし、コードをロックダウンすればするほど、柔軟性と拡張性が低下します。

于 2012-09-28T08:46:04.420 に答える