为什么原型的成员函数中有“自我”?

时间:2016-03-12 23:15:45

标签: javascript prototype self

我经常看到并使用self作为数据成员来保证对所有嵌套作用域内的根对象的正确访问:

function Foo() {
    var self = this; // Common design pattern
}

但是,我不明白为什么在以下代码段中定义了self(请参阅this jsfiddle):

function Foo() {
}

Foo.prototype.foo = function() {
    // Returns 'object'!  Why is 'self' defined?
    console.log("typeof self = " + typeof self);
}

var f = new Foo();
f.foo(); // Prints "typeof self = object"

有人可以解释为什么self在函数的prototype对象上定义的函数内可用。

1 个答案:

答案 0 :(得分:3)

self是全局window对象的属性,因此无需使用window作为前缀即可使用它。由于window是一个对象,这就是控制台吐出的内容,但console.log行可以是self未被重新定义为其他内容并且会提供相同输出的任何位置。

当您看到开发人员声明一个名为self的变量时,他们正在为该标识符创建一个更本地的定义,并且在该范围的持续时间内隐藏全局自我

示例:

// In the global scope:
console.log(self);  // window

function foo(){
  // this declaration will hide the global self with a local version
  // only good for this function
  var self = this;  // or whatever

  console.log(self);  // Depends on how foo is invoked
}

如果您修改示例代码,请稍微修改:

function Foo() {
}

Foo.prototype.foo = function() {
    // Returns 'object'!  Why is 'self' defined?
    console.log(self); // <-- not typeof self
}

var f = new Foo();
f.foo(); // Prints window

顺便说一句,这就是为什么开发人员不会使用self这个词,而是使用that

 var that = this;