0

JavaScript のクラス、プロトタイプの使用、そして最後に継承方法について学んできました。

私の理解から、以下は次のようになります。

  1. myInstance.getIt();呼び出されたため、「ジョン」にアラートを送信
  2. myInheritedInstance.getIt();呼び出されたため、アラート「ジャック」
  3. myInheritedInstance.getParent();.getIt()はMyClassに割り当てられています
  4. これにより、myInheritedInstance.getParent(); のときに「ジョン」にアラートが送信されます。と呼ばれます。

代わりに、実際に起こることは次のとおりです。

  1. アラート「ジョン」
  2. アラート ブランク
  3. アラート「ジャック」

私は愚かなことをしたか、ここで基本的な概念を誤解したと感じているので、助けていただければ幸いです。

var MyClass = function() { };

MyClass.prototype.constructor = MyClass;
MyClass.prototype.name = "John";
MyClass.prototype.getIt = function () { alert(this.name); };

var myInstance = new MyClass();
myInstance.getIt();

//Now inheritance

var MyInheritedClass = function () { };
MyInheritedClass.prototype = new MyClass;
MyInheritedClass.prototype.constructor = MyInheritedClass;
MyInheritedClass.prototype.name = "Jack";
MyInheritedClass.prototype.getIt = function () { alert(this.name); };
MyInheritedClass.prototype.getItParent = MyClass.prototype.getIt.call(this);

var myInheritedInstance = new MyInheritedClass();
myInheritedInstance.getIt();
myInheritedInstance.getItParent();
4

1 に答える 1

3

犯人は次のとおりです。

MyInheritedClass.prototype.getItParent = MyClass.prototype.getIt.call(this);

.call関数を返すのではなく、関数を呼び出します。そのため、2 つの問題が発生します。事前に呼び出すことと、呼び出すことができないものを返すことです (コンソールにエラーが表示されます)。あなたがしなければならないでしょう:

MyInheritedClass.prototype.getItParent = function() {
    alert(Object.getPrototypeOf(Object.getPrototypeOf(this)).name);
};

問題は、継承されたクラスによってシャドウされているため、nameアクセスできなくなったことです。this元のクラスを取得するnameには、プロトタイプ チェーンを 2 回上る必要がありますinherited instance -> inherited prototype -> original prototype

この線

MyClass.prototype.constructor = MyClass;

ちなみに、ここでは必要ありません。上書きした場合は紛失してしまうので復元constructorが必要です。したがって、あなたの場合、継承されたクラスにのみ必要です。prototypeconstructor

また、ライン

MyInheritedClass.prototype.getIt = function () { alert(this.name); };

MyClass.prototype.getIt余分です、それはあなたが継承した - とまったく同じです。

JavaScript には実際の「クラス」がないことに注意してください。ただし、その動作はこのように実現できます。

于 2012-05-23T17:18:14.660 に答える