2

私は本質的に強化された「クラス」を持っていますArray:

function NamedArray(name) {
  var result = [];
  result.name = name;
  return result;
};

var cheeses = new NamedArray('Cheeses');

これはうまくいきます。うまくいかないのは、この「クラス」のプロトタイプを追加することです:

NamedArray.prototype = {
  nameInAllCaps: function() {
    return this.name.toUpperCase();
  }
};

cheeses.nameInAllCaps();
=> TypeError: Object #<Object> has no method 'nameInAllCaps'

私が最初に考えたのは、「プロトタイプ」をresult Array:

function NamedArray(name) {
  var result = [];
  result.name = name;
  for (var prop in NamedArray.prototype) {
    if (NamedArray.prototype.hasOwnProperty(prop) {
      result[prop] = NamedArray.prototype[prop];
    }
  }
  return result;
};

これは機能しますが、各インスタンスがプロトタイプ プロパティの独自のコピーを持つことになります。のプロトタイプチェーンに NamedArray.prototypeを挿入する方法はありresult Arrayますか?

4

1 に答える 1

2

ジェームズ、

問題は、「コンストラクター」が、によって作成された新しく割り当てられたオブジェクト以外のものnewを返していることです。(代わりに、コンストラクターから配列を作成し、それを返します。)

コンストラクター コードのこの紛らわしい側面を修正するには、次のようなことを検討してください。

function NamedArray(name) {
  this.name = name;
};

NamedArray.prototype = new Array();
NamedArray.prototype.nameInAllCaps =  function() {
  return this.name.toUpperCase();
}

c = new NamedArray("cheeses");
console.log(c.name);
console.log(c.nameInAllCaps());
于 2011-04-11T00:08:18.690 に答える