1

JavaScript の標準的なプロトタイプの継承は次のとおりです。

function Animal() {
    this.legs = 0;
}
Animal.prototype.move = function () {
    alert("I'm moving!");
}

Bird.prototype = new Animal();
Bird.prototype.constructor = Bird;
function Bird() {
    this.legs = 2;
    this.wings = 2;
}
Bird.prototype.move = function () {
    alert("I'm flying!");
}

Bird の関数定義は、Bird のプロトタイプとコンストラクターの割り当ての後に来る必要がありますか。名前空間内からこれを実行しようとしており、変数の巻き上げがコードの失敗を引き起こしているため、これを尋ねます。例として:

var namespace = {};
namespace.Animal = function () {
    this.legs = 0;
};
namespace.Animal.prototype.move = function () {
    alert("I'm moving!");
};

namespace.Bird.prototype = new namespace.Animal();
namespace.Bird.prototype.constructor = namespace.Bird;
namespace.Bird = function () {
    this.legs = 2;
    this.wings = 2;
};
namespace.Bird.prototype.move = function () {
    alert("I'm flying!");
};

namespace.Bird.prototype 代入文を巻き上げたおかげで、namespace.Bird.prototype.constructor 代入文は失敗しました。ただし、次のコード ブロックに示すように、namespace.Bird 関数の割り当てをこれら 2 行の上に移動すると、コードは機能するように見えます。

namespace.Bird = function () {
    this.legs = 2;
    this.wings = 2;
};
namespace.Bird.prototype = new namespace.Animal();
namespace.Bird.prototype.constructor = namespace.Bird;

ただし、ほとんどのリソースが関数の割り当てを最初にするのではなく、元の順序で表示する特定の理由があるかどうかはわかりません。

誰かが明確にしてもらえますか?

ありがとう!

4

1 に答える 1

1

その理由は、関数の解析時の可用性と関数の実行時の可用性に関係しています。

例えば:

var afunc = asdf;
function asdf(){} 

と同じです

function asdf(){} 
var afunc = asdf;

しかし、

var afunc = asdf;
var asdf = function(){};

と同じではありません

var asdf = function(){};
var afunc = asdf;

なぜそれは理にかなっていますか?

また、この質問への回答はおそらくあなたを助けるでしょう

var functionName = function() {} vs 関数 functionName() {}

于 2011-08-07T02:58:04.313 に答える