0

このコードは、OOPの継承とJavaScriptでのベースクラスの呼び出しをシミュレートするために作成したもので、次のように機能します。

function Animal(name,age)
  {
    this._name = name; 
    this.setName = function (name) { this._name = name }
    this.getName = function() { return this._name }
  }

  function Cat(name,age)
  {
    Animal.call(this,name,age); // call baseclass constructor
    this.getName = function() { return Cat.prototype.getName.call(this)+", a cat" }
  }
  Cat.prototype = new Animal(); // will create the baseclass structure

  /// *****  actual execution  *****
  var puss = new Cat("Puss",3);
  var cheshire = new Cat("Cheshire",10);
  // do some actions
  console.log ( puss.getName() );
  // change cat's name
  puss.setName("Puss in boots");
  alert ( "new name -->"+puss.getName() );

問題は、「new Cat()」のインスタンスごとに、「getName」関数と「setName」関数が複製されることです。私はプロトタイピングに関する多くの記事を読みましたが、基本クラス関数の呼び出しの問題に対処したものはありませんでした。

4

3 に答える 3

1

たとえば、関数のプロトタイプにメソッドを割り当てる必要があります。

function Animal(name, age) {
    this._name = name;
    this._age = age;
}
Animal.prototype.getName = function () { return this._name; }
Animal.prototype.setName = function (value) { this._name = value; }

function Cat(name, age) {
    Animal.call(this, name, age);
}
Cat.prototype = new Animal();
Cat.prototype.getName = function () { 
    return Animal.prototype.getName.call(this) + ", a cat"; 
}
于 2012-04-21T15:55:44.783 に答える
0

http://phrogz.net/js/classes/OOPinJS2.htmlから

Javascriptには、親クラスを指す「スーパー」プロパティはありません。代わりに、Functionオブジェクトのcall()メソッドを使用します。これにより、別のオブジェクトをコンテキストとして使用して関数を実行できます。この関数にパラメーターを渡す必要がある場合、パラメーターは「this」の後に続きます。

あなたの場合、それは「メソッド」と同じように関数で機能するので、次のことができます。

Animal.prototype.setName.call(this, name);
于 2012-04-21T15:01:18.107 に答える
0

__proto__プロトタイプデータを保存 するものをお探しですか?https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto

これを行うconsole.log(puss.__proto__.getName)と、「baseclass」関数のように見えるものが得られますが、これがクロスブラウザであるかどうかはわかりません。

于 2012-04-21T15:02:14.610 に答える