7

ここで何かが足りないのかもしれません。私はJavaScriptでOOPを初めて使用するので、ご容赦ください。しかし、私は自分の問題の解決策を見つける必要があります。

私はこのコードを持っています。

var parent = function() {}
parent.prototype.someFunc = function() {
  return "a string";
}

今、私は以下のようなコードを使用して親を継承しようとしています.

var child = function() {
    parent.call(this);
}
child.prototype = new parent();

私がこのようにすると、うまくいきます。

var obj = new child();
obj.someFunc();

しかし、以下のように子の中に someFunc() を入れたいのですが、

var child = function() {
  parent.call(this);
  var someVal = this.someFunc(); // method from parent.
}
child.prototype = new parent();

それを行うとエラーがスローされますが、Uncaught TypeError: Object [object global] has no method 'getLightBox'私が知っているthisように、現在のオブジェクトを参照しており、この問題を解決する方法についてここで混乱しています。私が間違っている場合は、私を修正してください。もしくは他に良い方法があれば教えていただきたいです。

4

5 に答える 5

3

を使用するのを忘れていますnewchild(...)IEの代わりに行うコードがありますnew child(...)

いくつかのヒント:

また

  • newプロトタイプのリンクには使用しないでください。Child.prototype = Object.create(Parent.prototype)
于 2013-06-20T16:30:19.723 に答える
2

好ましい解決策

Javascript OOP はコンテキスト処理に固有のものです。親がコンテキスト ( this ) で動作する場合は、子の親をそのコンテキストで呼び出すだけです (コンテキストをグローバルから新しく作成されたオブジェクトに設定するnew function()に注意してください)。

var parent = function() { // constructor, should be called with new
  this.someFunc = function() { return "a string"; }
}

var child = new function() { // object, was already called with new
  parent.call(this); // set parent context to child's, don't create new one
  var someVal = this.someFunc(); // method from parent.
}

console.log(child.someFunc()); // a string

アプローチに近い代替の非標準ソリューション

コンテキストを操作する代わりに親プロトタイプを設定する場合は、そのプロトタイプにアクセスできる非標準メンバーを使用できます。 __proto__

var parent = function() {} // constructor to create empty object
parent.prototype.someFunc = function() { // someFunc is in parent prototype
  return "a string";
}

var child = new function() {
  this.__proto__ = new parent(); // set prototype to parent with its own context
  var someVal = this.someFunc(); // method from parent.
}

console.log(child.someFunc()); // a string

あなたの実例と比較して

standard を使用して、プロトタイプをオブジェクトではなく、コンストラクターに設定することもできますprototype。プロトタイプが設定された後にオブジェクトが作成されることに注意してください。new呼び出しの位置を確認し、それを質問に対する Felix Kling のコメントと比較してください。

var parent = function() {}
parent.prototype.someFunc = function() {
  return "a string";
}

var child = function() { // no new here
  var someVal = this.someFunc();
}
child.prototype = new parent();

console.log((new child).someFunc()); // new moved here

エラーの説明

関数 withnewは、JavaScript の関数からコンストラクターを作成します。文脈が関数そのものになるということです。なしnew(およびデフォルトの非厳密な動作)では、コンテキストはグローバルコンテキストであるため、エラーが発生します

Object [object global] has no method 'someFunc'
于 2013-06-08T08:54:56.850 に答える
2

こんにちは、ここであなたはあなたの概念に間違っています。まず、コードで行った次の問題について知る必要があります

ここでは継承の複合形式を使用しています。
子のプロトタイプが親のインスタンスであるという方法でのプロトタイプの連鎖 (実装の継承) //somefunc() は実際にはこの方法で子のインスタンスではなく子のプロトタイプに継承されます//

子コンストラクター内で親コンストラクターを呼び出すことによるコンストラクターの盗用(古典的な継承)//この方法では何も継承されません//

したがって、ここでの問題は、ほぼすべての初心者が結合継承で行う問題に遭遇したことです。問題は

複合継承では、SuperType(parent) を 2 回呼び出します。古典的な継承と、child.prototypeを親のインスタンスにすることによるもの 古典的な継承から(つまり、子コンストラクター内から)最初の呼び出しを行いました。これまで、親オブジェクトのインスタンスとしてchild.prototypeを作成していませんプロトタイプの継承を介して子のインスタンスに割り当てられた this.someFunc() を使用しています。これがエラーの原因です。

解決策: 子プロトタイプを親オブジェクトのインスタンスとして設定するための親オブジェクトへの最初の呼び出し [child.prototype=new parent();] ans を作成してから、2 番目の呼び出し [子のインスタンスの作成] を作成します。

要するに、私はこれを意味しました

<script>
var parent = function() {}
parent.prototype.someFunc = function() {
  return "a string";
}
var child = function() {
  parent.call(this);
  someVal = this.someFunc(); // method from parent.
}
child.prototype = new parent();
var obj = new child();

alert(someVal);
</script>

より良い解決策は、親オブジェクトが古典的な継承によって一度だけ呼び出される寄生結合継承を使用することです。

于 2013-06-10T08:30:19.190 に答える
1

呼び出そうとしている関数が、それ自体のオブジェクトではなく、親オブジェクトのプロトタイプにあることを確認してください(クラスメソッドと「静的」メソッド)。メソッドが「静的」である場合、子クラスで呼び出すことはできませんこれが

parent.method.call(this)
于 2013-06-08T07:47:08.943 に答える