5

コンストラクターを含むこのGoogleClosurejavascriptコードのスニペットでは、なぜgoog.base(this);必要なのですか?FooDisposable withをまだ継承していませんgoog.inherits(foo, goog.Disposable);か?

goog.provide('Foo');

/**
 * @constructor
 * @extends {goog.Disposable}
 */
Foo = function() {
  goog.base(this);
}     
goog.inherits(foo, goog.Disposable);

foo.prototype.doSomething = function(){
  ...
}

foo.prototype.disposeInternal = function(){
  ...
}
4

3 に答える 3

9

goog.inherits(childConstructor、parentConstructor)

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(self、opt_methodName、var_args)

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);


参考文献

于 2012-06-20T20:13:26.363 に答える
1

JavaScriptでは、関数が定義されている場所ではなく、関数の呼び出しthis方法によって完全に設定されます(Java、C#、およびC ++の場合のように)。したがって、呼び出しで呼び出し元の場所になるには、またはを使用する必要があります。それ以外の場合は、を呼び出したばかりの場合、呼び出し内はになります。this goog.Disposablethis.call.applygoog.Disposable()thisgoog

基本的に、this呼び出す関数を設定するには2つの方法があります。

  1. 使用obj.func()またはobj["func"]()表記—たとえば、オブジェクトからプロパティを取得するのと同じ全体的な式の一部として呼び出しを行います。これは、呼び出し内でthis参照することをエンジンに通知しますobj

  2. 最初の引数として使用するオブジェクトを指定することにより、callまたはをより明確に使用します。との唯一の違いは、他の引数を指定する方法です。を使用すると、それらを個別の引数として指定します。たとえば、set toと引数、、、およびを使用した呼び出しです。を使用して、引数を配列のような2番目の引数として指定します。applythiscallapplycallfoo.call(obj, 1, 2, 3)foothisobj123applyfoo.apply(obj, [1, 2, 3]);[]var a = [1, 2, 3]; foo.call(obj, a);

さらに探索する:

于 2012-06-20T15:15:55.630 に答える
1

あなたが見ることができます

Foo = function() {
  goog.base(this); //call parent constructor
}     
goog.inherits(foo, goog.Disposable);

として:

public class Foo extends Disposable(){
  public Foo(){
    super(); // call parent constructor
  }
}
于 2013-09-09T01:21:00.003 に答える