【问题标题】:Cant use prototype if constructor return object如果构造函数返回对象,则不能使用原型
【发布时间】:2015-12-30 14:46:06
【问题描述】:

谁能给我解释一下:

var foo = function() {
  if (!(this instanceof foo))
    return new foo();
  return {}; // Object
};
foo.prototype.myPlugin = function () { // Uncaught TypeError: foo(...).myPlugin is not a function
  alert("bar")
};

foo().myPlugin();

但是:

var foo = function() {
  if (!(this instanceof foo))
    return new foo();
  return ""; // string, number, etc
};
foo.prototype.myPlugin = function () {
  alert("bar") // --> "bar"
};

foo().myPlugin();

如我所见,jquery 像第一个代码示例一样工作,并返回找到的 DOM 节点数组。但是当我尝试返回数组时,我也有这个错误。

【问题讨论】:

  • jQuery?这里没有 jQuery 或 Dom 节点。我知道为什么第一个代码段会引发错误,但我对第二个代码段的目的感到困惑。

标签: javascript


【解决方案1】:

如果您从构造函数返回一个对象,该对象将被返回,而不是由new 创建的对象。如果您返回任何其他类型,您的返回值将被忽略,而是返回新对象。

jQuery 不返回 DOM 元素数组。 The jQuery object is just array-like itself。它有一些数字属性、一个length 属性和一个splice 方法,这就是您能够访问像obj[0] 这样的元素以及让控制台像数组一样记录它所需要的一切。

【讨论】:

    【解决方案2】:

    这就是 javascript 的方式。在构造函数中,如果您返回原始类型,则它会返回构造的对象。简单地忽略原始值。如果它返回一个对象,则返回该对象。

    例如

    function ReturnsObject(){ return {}; }
    function ReturnsPrimitive(){ return 5 // 'string'; }
    console.log( new ReturnsObject()) // {}
    console.log( new ReturnsPrimitive()) // ReturnsPrimitive{}
    

    【讨论】:

      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多