0

这样的事情有效吗?

(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.namespace.Something 是;

window.some = {};
window.some.namespace = {};
window.some.namespace.Something = (function () {
    "use strict";

    this.doSomething = function (els) {
        els.blah();
    }

});

(想象window.another.namespace.Else与上面类似)

我以为这一切都会好的,不是吗?

如果没问题,错误的可能原因是什么?我找不到可能有什么问题。

4

4 回答 4

1

是的,它是绝对有效的,只要window.some.namespace.Something是一个对象(即不是文字)。

这是因为 JavaScript 中的对象就像 C 中的指针(即它们“指向”内存中的某个位置)。分配Smtgwindow.some.namespace.Something简单地意味着它们都指向内存中的同一位置。

例如,您可以说:

var body = document.body;
alert(body.innerHTML); // same as alert(document.body.innerHTML);

问题出在您的代码中。这是一个修复:http: //jsfiddle.net/yRuvf/

于 2013-04-02T22:20:34.160 回答
1

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();
于 2013-04-02T22:39:01.883 回答
1

好的,所以我有一个连接器,它遍历我的项目中的所有文件,连接和缩小文件,并单独创建一个包含所有脚本的 dev html。最近我更改了我的应用程序入口点的名称,在连接器中(我写得很快)我通过在任何地方都写字符串而不是将它放在一个静态变量中来引用文件(我知道......)我改变了它到新的并更新它以使用静态变量并忘记更新其中一个引用。

该应用程序从其列表中删除了入口点并将其添加到末尾。

但是,因为我忘记更新其中一个参考文件,所以该文件被添加了两次,一次在找到它的列表中,一次在最后。因此,当包含第一个文件时(在我的单独列出所有脚本的开发 html 中)它引用了“未定义”而不是函数,在后一个脚本中一切正常,所以我的应用程序即使出现错误也可以运行正在显示,所以我完全糊涂了。

这就是连接文件没有错误的原因,因为它不依赖于相同的引用。哎呀!多么波拉瓦。

因此,当我开始思考时,我在重命名命名空间时一定有一个系统错误,这让我完全看错了位置。

所以......当生成错误时,它确实不是构造函数,因为它当时没有定义。但后来它被定义了......并且代码将运行。

回答的每个人都帮助我找到了这个错误,一旦我知道 javascript 是有效的,我就能够找到它,因为我知道我应该在另一个位置寻找错误。

我希望我能接受多个答案!唉,我不能。

于 2013-04-02T23:25:03.640 回答
0

如果你正在做这样的事情:

var Obj = {};

那么这不是可以与 new 一起使用的带有构造函数的对象:

var o = new Obj();

javascript 中的构造函数基本上是一个函数,因此您可以执行以下操作:

var Obj = function(){};

var d = new Obj();
于 2013-04-02T22:04:04.480 回答