3

基本的にJavaScript (リンクからコピーされたコード)をサブクラス化するこの方法を知ってとてもうれしいです:Array

function SomeType() {
    this.push(16);
}

SomeType.prototype = [];
SomeType.prototype.constructor = SomeType; // Make sure there are no unexpected results

console.log(new SomeType()); // Displays in console as [16]

しかし、これは完全ではありません。このように配列を偽のサブクラスにしてメソッド取得する[]方法はありますか?

var a = [];
a[3]  = true;
console.log(a.length); //=> 4

var s = new SomeType();
s[3]  = true;
console.log(s.length); //=> 1

このようにして、forループを実行するときに配列として扱うことができます。

for (var i = 0; i < s.length; i++) {
  var item = s[i];
}
4

2 に答える 2

2

(非推奨の)を使用するブラウザーでのみ機能する__proto__ため、クロスブラウザーではありません:

var CustomArray = function ( ) {
  var array = [ 16 ];
  array.__proto__ = this.__proto__;
  return array;
};

CustomArray.prototype = [];
CustomArray.prototype.constructor = CustomArray;

var array = new CustomArray( );
console.log( array instanceof Array );       // true
console.log( array instanceof CustomArray ); // true

array[ 3 ] = 42;
console.log( array.length );                 // 4

他に方法はないと思います。

于 2012-05-29T14:57:39.370 に答える
0

「配列」をサブクラス化する最良の方法は、「配列」ではなく、別の「配列のようなオブジェクト」をサブクラス化することです。そこにはたくさんあります。1つはコレクションです。基本的に、配列が行うすべてのこと(括弧表記を含む)を実行しますが、「カスタム」プロトタイプであるため、サブクラス化時に問題が発生することが多いネイティブプロトタイプとは異なり、簡単にサブクラス化できます。

http://codepen.io/dustinpoissant/pen/AXbjxm?editors=0011

var MySubArray = function(){
  Collection.apply(this, arguments);
  this.myCustomMethod = function(){
    console.log("The second item is "+this[1]);
  };
};
MySubArray.prototype = Object.create(Collection.prototype);

var msa = new MySubArray("Hello", "World");
msa[2] = "Third Item";
console.log(msa);
msa.myCustomMethod();
于 2016-07-11T20:31:17.310 に答える