1

こんにちは、私は本からコーヒースクリプトを学んでいます。コーヒースクリプトpdfのマークベイツプログラミング両方が同じ実装をしているように見えますが、JavaScriptの動作に頭を悩ませています。

例-1

class Employee
  constructor: (@attributes)->
    for key, value of @attributes
      @[key] = value
  printInfo: ->
    alert "Name: #{@name}"
emp1 = new Employee
  name: "Mark"
  printInfo: ->
    alert "Hacked ur code !"

emp1.printInfo()

対応するJavaScript

var Emp, Employee, emp1, emp2;

Employee = (function() {

  function Employee(attributes) {
    var key, value, _ref;
    this.attributes = attributes;
    _ref = this.attributes;
    for (key in _ref) {
      value = _ref[key];
      this[key] = value;
    }
  }

  Employee.prototype.printInfo = function() {
    return alert("Name: " + this.name);
  };

  return Employee;

})();

emp1 = new Employee({
  name: "Mark",
  printInfo: function() {
    return alert("Hacked ur code !");
  }
});

emp1.printInfo();
これは「ハッキングされたurコード!」を警告します

例-2

class Emp
  constructor: (@attributes)->
  printInfo: ->
    alert "Name: #{@attributes.name}"
emp2 = new Emp
  name: "Mark"
  printInfo: ->
    alert "Hacked ur code"
emp2.printInfo()

対応するJavaScript

Emp = (function() {

  function Emp(attributes) {
    this.attributes = attributes;
  }

  Emp.prototype.printInfo = function() {
    return alert("Name: " + this.attributes.name);
  };

  return Emp;

})();

emp2 = new Emp({
  name: "Mark",
  printInfo: function() {
    return alert("Hacked ur code");
  }
});

emp2.printInfo();
これは「名前:マーク」に警告します

違いはどこにありますか?

4

2 に答える 2

2

最初の例では、コンストラクター ( ) に渡すオブジェクトのすべてのプロパティがattributes現在のインスタンスに追加されます (これがループの動作です)。インスタンス プロパティはプロトタイプ プロパティを隠します。そのprintInfoため、コンストラクタに渡した関数が実行されます。を使用して元のメソッドにアクセスできますEmployee.prototype.printInfo.call(emp1);

2 番目の例では、このようなことは何も起こりません。attributesオブジェクトは、インスタンスのプロパティ内にattributes存在します。別のアラートを取得するには、次のように記述する必要がありますemp2.attributes.printInfo();

于 2012-09-25T10:39:09.010 に答える
1

最初の例では、次のコードはprintInfoプロパティをオブジェクトに追加しています。

_ref = this.attributes;
for (key in _ref) {
  value = _ref[key];
  this[key] = value;
}

オブジェクトに「直接プロパティ」を追加する場所に細心の注意を払うthis[key] = value;ため、JS エンジンによってプロパティ検索が実行されると、オブジェクト自体のすぐそこにある「printInfo」メソッドが検出されるため、ダウンすることはありません。 Prototype チェーンに接続し、そこで定義したメソッドを呼び出します。を使用してオブジェクトのプロパティObject.hasOwnPropertyをテストすると、 true が返されることがわかります (これは、それが直接のプロパティ オブジェクトであり、プロトタイプ チェーンから継承されたものではないことを意味します)。printInfoemp1

Object.hasOwnProperty()リファレンス: hasOwnPropertyメソッド リファレンス

于 2012-09-25T10:45:23.347 に答える