0

私の質問は JavaScript の継承に関するものです。

var a = new Array();
var b = new Array();

a.prototype.max = function () {
 alert("Max");
}

b.max();

私の理解によると、 b.max() はb が maxを持っていないというエラーを出しますが、驚くべきことに (私にとっては) 3 行目に a does not have prototype というエラーが表示されます。typeof aを実行すると Object が返され、オブジェクトはプロトタイプ プロパティを持つことができます。

どこが間違っているのか、またはどの概念が正しく理解されていないのか説明していただけますか

4

5 に答える 5

0

prototypeすべてのオブジェクトではなく、関数オブジェクトに属します。

そうArray.prototypeです、a.prototype間違っています。

于 2013-11-13T05:04:38.153 に答える
0

次のようになります。

var a = new Array();
var b = new Array();

Array.prototype.max = function () {
 alert("Max");
}

b.max();
于 2013-11-13T05:07:00.207 に答える
0
> var a = new Array();

aは Array オブジェクトのインスタンスですが、Function オブジェクトのみがデフォルトでプロトタイププロパティを持ちます。すべてのオブジェクトには、[[Prototype]](非標準プロパティ以外では) アクセスできない隠しプロパティがあり__proto__、構築時 (または を介し​​て変更されたとき) にコンストラクタのプロトタイプを参照します__proto__

したがって、解決しようとすると:

a.prototype.max 

それから

a.prototype

未定義であるため、未定義のmaxプロパティを取得しようとすると、参照エラーがスローされます。

bArray のインスタンスでもあり、 maxプロパティはありません。あなたがしても:

a.prototype = {max: function(){});

bではなくから継承しているため、 maxプロパティはまだありませArray.prototypea.prototype

PS。ECMA-262 §15.3.2.1を参照してください: 「プロトタイプ プロパティは、関数がコンストラクターとして使用される可能性を提供するために、すべての関数に対して自動的に作成されます。」.

于 2013-11-13T05:07:16.027 に答える
0

特にライブラリを作成したり、コードが他の多くのプログラムで再利用されることが予想される場合は、Array のようなものを拡張しない方がよいでしょう。

Object.prototype.somethingElse=22;
Array.prototype.something=22;
var arr=[1];
for(thing in arr){
  console.log(thing);//0, something,somethingElse
};

この問題に加えて、Array.prototype.max の競合する実装を持つライブラリでコードが使用される可能性があります。

(i)frame の配列はメイン ページの配列と同じではないため、iframe または Frame から max 関数は存在しません。

call代わりに、追加の引数として配列を渡すか、または渡すことができる関数を記述します。

function max(){
  console.log(this);//<=[1,2]
  return Math.max.apply(Math,this);
};
var arr = [1,2];
max.call(arr);//=2
于 2013-11-13T05:39:03.383 に答える