goog.inherits()
子コンストラクターから親コンストラクターへのプロトタイプチェーンを確立します。
/**
* Inherit the prototype methods from one constructor into another.
* @param {Function} childCtor Child class.
* @param {Function} parentCtor Parent class.
*/
goog.inherits = function(childCtor, parentCtor) {
/** @constructor */
function tempCtor() {};
tempCtor.prototype = parentCtor.prototype;
childCtor.superClass_ = parentCtor.prototype;
childCtor.prototype = new tempCtor();
/** @override */
childCtor.prototype.constructor = childCtor;
};
プロトタイププロパティに加えて、コンストラクターは「独自の」プロパティ(つまり、インスタンス固有のプロパティがに追加されるthis
)を持つ場合があります。は親コンストラクターを呼び出さないためgoog.inherits()
、独自のプロパティは子コンストラクターにコピーされず、親の初期化コードは実行されません。これらの理由から、標準のパターンは、次の例のようにコンストラクターをチェーンすることです。
/**
* @param {string} name The parent's name.
* @constructor
*/
var Parent = function(name) {
/**
* @type {string}
* @private
*/
this.name_ = name;
}
/**
* @param {string} name The child's name.
* @constructor
* @extends {Parent}
*/
var Child = function(name) {
Parent.call(this, name);
}
goog.inherits(Child, Parent);
goog.base()
は、親メソッドを呼び出すためのヘルパー関数であるため、 call()またはapply()を明示的に使用する必要はありません。
[goog.base()]がコンストラクターから呼び出された場合、これは引数1-Nを使用してスーパークラスコンストラクターを呼び出します。
これがプロトタイプメソッドから呼び出される場合は、メソッドの名前をこの関数の2番目の引数として渡す必要があります。そうしないと、ランタイムエラーが発生します。これにより、引数2-Nを指定してスーパークラスのメソッドが呼び出されます。
goog.inherits
この関数は、クラス間の継承関係を表現するために使用する場合にのみ機能します。
クロージャコードではgoog.base()
、親コンストラクターを明示的に呼び出すのではなく、コンストラクターをチェーンするのが一般的です。
/**
* @param {string} name The child's name.
* @constructor
* @extends {Parent}
*/
var Child = function(name) {
goog.base(this, name);
}
goog.inherits(Child, Parent);
参考文献