在javascript中,别名名称空间
In javascript, alias namespace?
在javascript中,我不应该对名称空间进行别名吗?
在谷歌JavaScript风格指南的命名章节中,它说:
//Do not alias namespaces.
myapp.main = function() {
var namespace = some.long.namespace;
namespace.MyClass.staticHelper(new namespace.MyClass());
};
但我不能完全理解这个问题。为简洁起见,为什么不对名称空间进行别名?
更改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`
文档明确表示您应该本地别名长名称空间类型:
如果对完全限定的类型使用本地别名可以提高可读性,则可以这样做。本地别名的名称应与类型的最后一部分匹配。
然而,除了引用安全性之外,我无法想象为什么你不应该别名名称空间
别名命名空间的问题是引用不再指向相同的实例。
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
这个bug很难搜索。
不过别名有很多好处。JavaScript中的每个成员查找都需要花费时间。因此,拥有不断需要查找成员链的代码会浪费速度。由于本地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);
};
我认为这个规则只适用于命名空间对象:
本地别名的名称应与类型的最后一部分匹配。
您应该别名(参见上面的规则一)的是您真正想要使用的东西,在这里是MyClass
构造函数/命名空间。
改进代码:
myapp.main = function() {
var myClass = some.long.namespace.MyClass;
myClass.staticHelper(new myClass());
};
当然,这不适用于要使用其多个属性的名称空间。如果您的代码也需要namespace.TheirClass
,那就可以了。
相关文章:
- JavaScript名称空间和对象创建
- 在javascript中使用命名空间
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- javascript中的命名空间,IDE中支持代码完成/内容辅助's
- 具有大型几何图形的基于沙发的空间查询
- 如何使用javascript命名空间
- JSDoc:模块和名称空间之间的关系是什么
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- js命名空间和变量范围
- html,js-如何限制元素"范围“-命名空间
- 动画制作/减缓元素填充移除元素留下的空间
- 转换自的JavaScript命名空间
- 命名空间与自调用函数
- 在IndexedDB中保留空间
- EmberJS-适用于各种模型的适配器动态名称空间
- 什么's当前命名空间/类中JavaScript子命名空间/类的语法
- 在javascript中,别名名称空间
- Google Closure编译器为命名空间创建了不完整的别名
- XML 到 JSON - 处理 JavaScript 中的 xml 命名空间和别名
- 如何使用let关键字别名伪名称空间代码