JavaScript -将名称空间分配给局部变量以用于构造函数,但不确定发生了什么
JavaScript - Assigning namespaces to local variables for use in constructors, not sure what is happening?
这样的东西是有效的吗?
(function () {
"use strict";
var Smtg = window.some.namespace.Something,
Els = window.another.namespace.Else;
var smtg = null,
els = null;
smtg = new Smtg();
els = new Els();
smtg.doSomething(els);
}());
即使用将构造函数重命名为更短的局部变量,然后从这个更短的局部变量实例化?
只有我得到像TypeError: Smtg is not a constructor
这样奇怪的错误。当window.some. namspace . something为;
window.some = {};
window.some.namespace = {};
window.some.namespace.Something = (function () {
"use strict";
this.doSomething = function (els) {
els.blah();
}
});
(想象window.another. namspace . else与上面类似)
我以为这一切都没问题,不是吗?
如果可以,可能的错误原因是什么?
浏览器将抛出错误TypeError: Smtg is not a constructor
当且仅当Smtg
确实不是构造函数
如果Smtg是控制台中的一个函数,那么您可能在声明它之前尝试创建一个新实例。或者它在
中试图使用它的范围内被覆盖示例-这将抛出一个错误
window.name = {}
window.name.space = {}
window.name.space.something = (function(){});
function test(){
var scopeOverwriter = function(){
this.name = "not a obejct anymore";
this.getNewSomething();
}
scopeOverwriter.prototype = {
getNewSomething = function(){
return new name.space.something();//name is a string here
}
}
return new scopeOverwriter();
}
test();
是的,它是绝对有效的,只要window.some.namespace.Something
是一个对象(即不是一个文字)。
这是因为JavaScript中的对象就像C中的指针(即它们"指向"内存中的某个位置)。将Smtg
赋值给window.some.namespace.Something
仅仅意味着它们都指向内存中的同一位置。
例如,你可以说:
var body = document.body;
alert(body.innerHTML); // same as alert(document.body.innerHTML);
问题出在你的代码里。这里有一个修复:http://jsfiddle.net/yRuvf/
好的,所以我有一个连接器,遍历我的项目中的所有文件,并连接和缩小文件,并创建一个dev html与所有脚本单独。最近,我更改了应用程序入口点的名称,在concattenator(我很快编写的)中,我通过在任何地方写入字符串来引用文件,而不是将其放在一个静态变量中(我知道……)我将其更改为新的,并将其更新为使用静态变量,但忘记更新其中一个引用。
应用程序从列表中删除入口点,并将其添加到末尾。
然而,因为我忘记更新其中一个引用,文件被添加了两次,一次在列表中找到它,一次在末尾。因此,当第一个文件被包含(在我的dev html中单独列出所有脚本)时,它引用了"未定义"而不是函数,在后者的脚本中,一切都很好,所以我的应用程序即使显示错误也会运行,所以我完全困惑了。
这就是为什么连接的文件工作没有错误,因为它不依赖于相同的引用。eeesh !真是个笨蛋。
因此,当我开始思考时,我一定是在重命名命名空间时出现了系统错误,这使我完全看错了位置。
所以…当错误生成时,它确实不是构造函数,因为它当时没有定义。但后来它被定义为…代码会运行。
每个回答的人都帮助我找到了这个bug,我能够找到它,一旦我知道javascript是有效的,因为我知道我应该在另一个位置寻找这个bug。
我希望我能接受不止一个答案!唉,我不能。
如果你正在做这样的事情:
var Obj = {};
则该对象不具有可用于new的构造函数:
var o = new Obj();
构造函数在javascript中基本上是一个函数所以你可以这样做:
var Obj = function(){};
var d = new Obj();
- ES6构造函数返回基类的实例
- 使用Google Visualization动态调用构造函数
- javascript中对象构造函数中的var属性与this.properties
- 理解typescript中的构造函数接口
- 为什么构造函数不是构造函数
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 拦截对构造函数的调用
- 使用闭包共享构造函数参数
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- 从js引擎的角度来看闭包和构造函数是如何工作的
- 如何使用此从对象访问构造函数
- Javascript:为什么是构造函数's __proto__属性Empty(){}
- 获得“;jvm.Map不是构造函数“;用于jvectormap
- 构造函数中的 JavaScript 函数不适用于 onclick
- 用于初始化对象的编码模式 - 构造函数(新)与 Object.create()(Crockford)
- 使用Object.keys获取用于创建构造函数实例的属性,然后打印继承的属性
- 如何将jQuery构造函数用于多个类型的html值
- 对象.创建而不是用于继承的构造函数
- JavaScript -将名称空间分配给局部变量以用于构造函数,但不确定发生了什么
- Javascript构造函数用于计算实例数