好ましい解決策
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'