1

クラスとモジュールに関する第9章のpp 200-201にあります。以下のこのアプローチはより簡単だと思いましたが、以下のコメント付きの出力行は不明な理由で機能しません。

Range.prototype = {
  includes: function(x) {
    return this.from <= x && x <= this.to;
  },

  foreach: function(f) {
    for (var x = Math.ceil(this.from); x <= this.to; x++) f(x);
  },

  toString: function() {
    return "(" + this.from + "..." + this.to + ")";
  },

  Z: "ZZZZZZZZZZZZZZZZZZZ",    
}

function Range(from,to) {
  this.from = from
  this.to = to
}

var r = new Range(1,3)

console.log(Range.prototype.Z)
console.log(r.constructor.prototype.Z)  //undefined 
console.log(r.Z)
console.log(r.includes(2));
console.log(r.toString());
console.log(r);  // Does not use Range.toString 
r.foreach(console.log); // TypeError 
4

1 に答える 1

1

1)console.log(r.constructor.prototype.Z) //undefined

問題は、r.constructor === Objectではなく、ということですRange。これは、値がprototypeオブジェクトから継承され、それ自体がconstructorof を持つためですObject

Range期待どおりに参照するには、プロトタイプ内でオーバーライドする必要があります。

Range.prototype = {
  constructor: Range,
  ...
}

[編集] または、全体を新しいオブジェクトに設定するのではなくprototype、既存のオブジェクトを拡張できます。

Range.prototype.includes = function ...;
Range.prototype.foreach = function ...;
Range.prototype.toString = function ...;
Range.prototype.Z = "ZZZZZZZZZZZZZZZZZZZ";

これにより、 などのプリセット キーは、自分で設定しなくconstructorても の一部のままになります。prototype


2)console.log(r); // Does not use Range.toString

コンソールは単に使用しませんtoString()。代わりに、インスタンスが参照可能としてリストされるため、そのすべてのプロパティとその値を確認できます。

の結果を表示したい場合はtoString()、前の行で行ったように自分で呼び出す必要があります。

console.log(r.toString());

3)r.foreach(console.log); // TypeError

log具体的には、そのコンテキスト ( の値this) がである必要がありますconsoleが、コンテキストなしで単純な関数参照として渡されています。

bindメソッドとして呼び出すか、次のように呼び出すことができるように、別の関数でラップする必要がありますconsole

r.foreach(function (n) { console.log(n); });
r.foreach(console.log.bind(console));
于 2012-07-10T20:01:12.680 に答える