19

让我们看两个示例,我将在其中尝试解释我想要理解的内容。

var Car = function(){
  // Init class
  function Car() { };
  // Private func/vars
  var private = { color:'red' };
  // Public func/vars
  Car.prototype = {
    newColor: function(color) { private.color = color },
    getColor: function() { return private.color }
  };

  return Car.prototype; // return with prototype
};

var myCar = new Car();

和:

var Car = (function(){
  // Init class
  function Car() { };
  // Private func/vars
  var private = { color:'red' };
  // Public func/vars
  Car.prototype = {
    newColor: function(color) { private.color = color },
    getColor: function() { return private.color }
  };

  return Car; // avoid prototype adding parentheses on next line;
})();

var myCar = new Car();

让我们看看!,这两个类都是作为函数表达式创建的,并且都同样工作。它们之间的唯一区别是: 第一个返回 Car 函数及其原型属性。第二个工作返回 Car 函数,避免原型属性,而是使用 IIFE。

return Car.prototype;使用和避免 IIFE 和使用return Car;使用 IIFE (类声明末尾的括号)有什么区别。

4

1 回答 1

17

第二个代码示例是实现您正在寻找的正确方法。您创建一个立即执行的函数,在其中创建一个新函数,添加到它的原型,然后返回它。

第一个示例有点奇怪,并没有完全正确地创建构造函数。线

return Car.prototype; // return with prototype

使您的 Car 函数始终简单地返回您之前分配给的对象文字Car.prototype。这会覆盖调用的函数的正常行为new


只需要注意一件事,这一行:

Car.prototype = {
   newColor: function(color) { private.color = color },
   getColor: function() { return private.color }
};

将导致constructor新创建对象的属性不再指向您的 Car 函数。如果这对您很重要,有两种简单的方法可以解决此问题。

Car.prototype = {
   newColor: function(color) { private.color = color },
   getColor: function() { return private.color }
};
Car.prototype.constructor = Car;   // <-------- add this line

或者把上面的改成

Car.prototype.newColor = function(color) { private.color = color };
Car.prototype.getColor = function() { return private.color };
于 2012-11-05T05:19:32.817 回答