2

私はJavascriptで継承へのより高度なアプローチを学ぼうとしていますが、継承されたオブジェクトがEloquentJavascriptの以下のサンプルコードの「this」キーワードバインディングを失っている理由を理解できません。

たとえば、次を使用してtake()関数を呼び出してみました。

lantern.take(); // alerts you can not lift
Item.take.call(lantern, "the brass lantern"); // alerts you can not lift
lantern.take.call(this, "the brass lantern"); // alerts you can not lift

これらのどちらもthis.nameをランタンにバインドしませんか?オブジェクトのプロトタイプで定義されたメソッドを呼び出すためのアプローチで、何が欠けているか、理解していないのですか?ありがとうございました。

function forEachIn(object, action) {
  for (var property in object) {
    if (object.hasOwnProperty(property))
      action(property, object[property]);
  }
}

function clone(object) {
  function OneShotConstructor(){}
  OneShotConstructor.prototype = object;
  return new OneShotConstructor();
}

Object.prototype.create = function() {
  var object = clone(this);
  if (typeof object.construct == "function")
    object.construct.apply(object, arguments);
  return object;
};

Object.prototype.extend = function(properties) {
  var result = clone(this);
  forEachIn(properties, function(name, value) {
    result[name] = value;
  });
  return result;
};

var Item = {
  construct: function(name) {
    this.name = name;
  },
  inspect: function() {
    alert("it is ", this.name, ".");
  },
  kick: function() {
    alert("klunk!");
  },
  take: function() {
    alert("you can not lift ", this.name, ".");
  }
};

var lantern = Item.create("the brass lantern");
lantern.kick(); // alerts klunk
4

1 に答える 1

5

とは異なりconsole.logalert引数は 1 つしか取りません。文字列を連結する必要があります。

alert("you can not lift " + this.name + ".");

lantern.take();それにより、同等のとの両方Item.take.call(lantern);が「真鍮のランタンを持ち上げることができません。」と警告しますが、3番目の例は現在の実行のthisキーワードの値に依存します。ところで、あなたのtake関数は引数を取りません。

于 2012-11-28T19:47:41.293 に答える