【问题标题】:JavaScript Namespace a function/class?JavaScript 命名空间是一个函数/类?
【发布时间】:2012-09-11 07:32:36
【问题描述】:

所以说我有这样的功能:

function Moo()
{
    this.someVal = 'blah';

    return this;
}

Moo.prototype = 
{

}

如果我从这个类中实例化一个对象:

var moo = new Moo();

console.log(moo);

我在控制台中得到这个,而不是带有 someVal 的对象

Window www.domain.com

【问题讨论】:

  • 你描述的没有意义。如果您在Moo 构造函数或方法Moo.prototype.foo() 中使用this,它将引用Moo 的实例。请展示一个实际有问题的代码示例,描述您预期会发生什么,以及 正在发生什么
  • 我认为 OP 在问他如何设置 myNameSpace.Moo 构造函数。
  • 是的,我已经更新得更好了,它是窗口对象而不是父对象中的任何 this。
  • 你确定你试过了吗?这是一个带有您示例的jsfiddle。 jsfiddle.net/qfYV2 按预期输出一个带有 someVal = 'blah' 作为属性的对象。
  • 虽然您的构造函数中的 return 语句完全没有必要,但我也看不出如何使用您的代码示例获取对 window 的引用。如果您确实看到了这一点,并且当您运行 @Mark 发布的示例时它被复制了,我不得不问它是什么浏览器......

标签: javascript class namespaces


【解决方案1】:

我不确定我是否理解这个问题,但这里的解释可能会有所帮助。

在纯 javascript(即 ECMAScript)中,当使用 new 运算符调用函数时,它的 this 引用一个新对象,就像由 new Object() 创建的一样,其内部 [[Prototype]] 设置为构造函数的公共 @ 987654327@对象。

返回的是新对象(不需要return this,这是默认操作),除非返回其他对象。

当一个函数被调用时,它的this完全由调用设置,上下文(即作用域)是无关紧要的。

所以:

function Moo() {
  // if called with new, this references a new object
}

// Assign a new object to Moo.prototype,
// replacing the default object given to all functions
Moo.prototype = { 
  someMethod: function() {...},
  ...
} 

// Create an instance of Moo
var moo = new Moo();

// Call a method
moo.someMethod();       

在最后一行中,someMethod 中的this 将引用moo 对象,但这完全取决于方法的调用方式,与moo 的构造方式或上下文无关从中调用它。

例如如果someMethod 调用如下:

var x = moo.someMethod;

x();

this 的值尚未设置,因此在someMethod 中它将默认为全局(窗口)对象,或者在严格模式下,它将是未定义的。

请注意,无论调用的上下文如何,上述情况都会发生,this 是动态的,完全由调用设置(忽略ES5 bind)。

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 2013-11-19
    • 2013-09-28
    • 2016-02-14
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2012-05-27
    • 2013-10-25
    相关资源
    最近更新 更多