10

javascript では、名前空間に別名を付けるべきではありませんか?

Google JavaScript Style Guide命名の章では、次のように述べています。

//Do not alias namespaces.
myapp.main = function() {
  var namespace = some.long.namespace;
  namespace.MyClass.staticHelper(new namespace.MyClass());
};

しかし、私はこの問題を完全に理解することはできません。簡潔にするために名前空間にエイリアスを付けてみませんか?

4

3 に答える 3

6

を変更するthisと、エイリアス化された名前空間の関数が壊れる可能性があります。例:

var foo = {
    bar: function () {
        console.log(this.baz);
    },
    baz: 42
};

foo.bar(); // prints 42
var alias = foo.bar;
alias(); // prints undefined, because `this` is no longer `foo`
于 2012-08-01T13:23:56.403 に答える
3

このドキュメントでは、長い名前空間を持つ型をローカルでエイリアスする必要があると明示的に述べています。

読みやすさが向上する場合は、完全修飾型のローカル エイリアスを使用します。ローカル エイリアスの名前は、型の最後の部分と一致する必要があります。

ただし、参照の安全性を除いて、なぜ名前空間に別名を付けてはいけないのか想像できません

エイリアス化された名前空間の問題は、参照が同じインスタンスを指していないことです。

my.long.namespaces.myFunc()
// this refers to the same function, but is a different reference
var myLocalNamespace = my.long.namespace;
namespace.myFunc();
// and you can easily introduce bugs which are hard to find
myLocalNamespace.myFunc = "foobar";
myLocalNamespace.myFunc()  // throws a type error because myFunc is now a string

このバグは検索が困難です。

ただし、エイリアシングには多くの利点があります。JavaScript での各メンバー ルックアップには時間がかかります。そのため、メンバーのチェーンを常に検索する必要があるコードを使用すると、速度が無駄になります。local のコストは無視できるほど小さいため、長い名前空間や関数の結果 ( など) などvarを参照する場合は常に、ローカル変数を使用することを強くお勧めします。$("something")また、コードがはるかに読みやすくなります。次の点を考慮してください。

var handleNamespace = function() {
    my.really.long.namespace.foo = "bar";
    my.really.long.namespace.doIt(my.really.long.namespace.foo);
    my.really.long.namespace.member = my.really.long.namespace.somethingElse(my.really.long.namespace.addOne(2));
};

ご覧のとおり、これはすぐに混乱します。コードの繰り返しをなくすと、処理能力が節約され、コードが読みやすくなります。

var handleNamespace = function() {
    var namespace = my.really.long.namespace,
        three = namespace.addOne(2);

    namespace.foo = "bar";
    namespace.doIt(namespace.foo);
    namespace.member = namespace.somethingElse(three);
};
于 2012-08-01T13:39:38.727 に答える
3

このルールは名前空間オブジェクトにのみ適用されると思います:

ローカル エイリアスの名前は、型の最後の部分と一致する必要があります。

エイリアスを作成する必要があるのは (上記のルールを参照)、実際に使用したいもの、ここではMyClassコンストラクター/名前空間です。

改善されたコード:

myapp.main = function() {
  var myClass = some.long.namespace.MyClass;
  myClass.staticHelper(new myClass());
};

もちろん、これはいくつかのプロパティを使用したい名前空間には当てはまりません。コードに も必要な場合はnamespace.TheirClass、問題ありません。

于 2012-08-01T13:40:18.837 に答える