在匿名函数中扩展原型 - 奇怪的效果

时间:2014-11-05 19:50:36

标签: javascript closures anonymous-function

在尝试使用私有静态方法的方法时,我遇到了这种非常奇怪的行为。在下面的代码中,公共方法getData被它自己的返回数据覆盖,但它永远不会被显式调用!这对我来说很奇怪,并想知道这里发生了什么。我认为根据模块模式不仅仅包含匿名函数中的整个页面,这对我来说是正确的,但我仍然希望理解这个错误。

function MyClass() {
    this._prop = true;
}
MyClass.prototype.getData = function () {
    this._prop = false;
    return { a: 2344, b: 765, c: 234 };
}

(function () {
    var privateStatic = 0;
    MyClass.prototype.getCount = function () {
        return privateStatic++;
    }
} ());

var m = new MyClass();
console.log(m.getData()); //Error (object is not a function)
console.log(m.getData); //prints {a:2344,b:765,c:234}

1 个答案:

答案 0 :(得分:0)

这种奇怪的行为的原因是由于在函数声明(大点,dandavis)之后缺少分号而且在它之后直接用IIFE包裹在parens中,因此立即调用了getData。基本上,这个:

MyClass.prototype.getData = function () {
  this._prop = false;
  return { a: 2344, b: 765, c: 234 };
} // Notice no semicolon here!
(function () {
  var privateStatic = 0;
  MyClass.prototype.getCount = function () {
    return privateStatic++;
  }
} ());

成为这个:

MyClass.prototype.getData = function () {
  this._prop = false;
  return { a: 2344, b: 765, c: 234 };
}();

因此,将getData属性设置为函数的返回值。因此m.getData打印{ a: 2344, b: 765, c: 234 }m.getData()的原因不起作用(它不再是函数!)。