Crockford构造函数:作为自己的财产与“__proto__”相关联

时间:2017-11-04 11:06:42

标签: javascript

标题可能听起来有点令人困惑。请允许我将Crockford的构造函数转换为以下简单示例,并使用两种不同的方式创建对象。 (浏览器是FireFox。)

var car = function(carSpec) {

  var maker = carSpec.maker;
  var year = carSpec.year;
  var that = {};

  that.getMaker = function () {
    return maker;
  };

  that.getYear = function () {
    return year;
  };

  return that;
};

正如Crockford所指出的,创建对象的一种方法是使用Object.create方法,

myCar = Object.create(car({maker: 'Nissan', year: 2004}));
console.log(myCar); // Object {}, on FireFox console.

并且方法getMakergetYear附加到__proto__

另一种方法是调用car并让它返回一个对象

yourCar = car({maker: 'Ford', year: 2010});
console.log(yourCar); // Object { getMaker: car/that.getMaker(), getYear: car/that.getYear() }

方法getMakergetYear成为对象yourCar的自有属性。

我的问题是:这个“Crockford构造函数”中这两种对象创建方式的优缺点是什么?

2 个答案:

答案 0 :(得分:1)

当您已经拥有所需的完整对象时,调用Object.create是没有意义的。只有当您有多个应该共享公共属性的对象时,继承才有用,但在您的示例中,getMakergetYear是每个汽车实例的自有属性。

答案 1 :(得分:0)

__proto__prototype中使用方法的优点是创建的对象的多个副本将指向相同的方法< / strong>即可。意味着只会创建每个方法的一个副本。减少(相对)使用内存。如果方法附加到对象本身,则每个对象都有自己的方法副本。