-1

所以说我有这样的功能:

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

    return this;
}

Moo.prototype = 
{

}

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

var moo = new Moo();

console.log(moo);

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

Window www.domain.com
4

1 回答 1

0

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

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

它是返回的新对象(不需要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();       

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

例如 ifsomeMethod调用如下:

var x = moo.someMethod;

x();

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

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

于 2012-09-19T01:15:32.290 回答