标题可能听起来有点令人困惑。请允许我将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.
并且方法getMaker
和getYear
附加到__proto__
。
另一种方法是调用car
并让它返回一个对象
yourCar = car({maker: 'Ford', year: 2010});
console.log(yourCar); // Object { getMaker: car/that.getMaker(), getYear: car/that.getYear() }
方法getMaker
和getYear
成为对象yourCar
的自有属性。
我的问题是:这个“Crockford构造函数”中这两种对象创建方式的优缺点是什么?
答案 0 :(得分:1)
当您已经拥有所需的完整对象时,调用Object.create
是没有意义的。只有当您有多个应该共享公共属性的对象时,继承才有用,但在您的示例中,getMaker
和getYear
是每个汽车实例的自有属性。
答案 1 :(得分:0)
在__proto__
或prototype
中使用方法的优点是创建的对象的多个副本将指向相同的方法< / strong>即可。意味着只会创建每个方法的一个副本。减少(相对)使用内存。如果方法附加到对象本身,则每个对象都有自己的方法副本。