【发布时间】:2013-08-28 07:19:09
【问题描述】:
根据我对 OOP javascript 的有限经验,处理具有不同属性但相同方法的多个对象的常用方法是使用如下构造函数:
function Animal ( type ) {
this.type = type
};
Animal.prototype.sayHello = function () {
return 'Hi, I am a ' + this.type
};
var goat = new Animal( 'Goat' );
我这里的理解是goat会继承/引用Animal的功能。
我假设我可以使用以下对象字面量概念复制上述内容:
var Animal = {
type : '',
sayHello : function () {
return 'Hi, I am a ' + this.type
}
}
var goat = Object.create( Animal );
goat.type = 'Goat';
对Animal 的继承在这里丢失了,还是Goat 仍然引用Animal 的方法?
我想知道使用Object.create() 而不是new 复制构造函数/类是否有任何问题。是否有性能偏移或任何理由继续使用new?
任何建议都将不胜感激,如果需要澄清,我很乐意补充问题。
更新对象创建
var Animal = {
sayHello : function () {
return 'Hi, I am a ' + this.type
}
}
var goat = Object.create( Animal, { 'type' : { value: 'goat' } } );
【问题讨论】:
-
您真的想在所有呼叫站点输入
goat.type(以及更多)?另外,如果你想改变它,重构会更难。这太可怕了。在有人说“创建工厂”之前,在这种情况下,您只是在做美化的构造函数+原型。 -
@Esailija 我添加了关于如何填充
type的更新。我很想知道你会如何处理这个问题。 -
这比我刚才批评的还要糟糕 :D 它仍然在调用站点,在对象外部,甚至更冗长
-
@Esailija 你能解释一下为什么,不仅仅是为了我自己的理解,而是为了其他用户?我需要创建多个对象。它们之间的唯一区别是
type。在下面的答案中,function CreateAnimal(type)和你坐得更好吗?我将不胜感激任何进一步的cmets。谢谢 -
那么
var a = new Animal(type)和var a = CreateAnimal(type)有什么区别?两者都一样方便,并将属性分配放在它们所属的地方。然而,代码在声明站点上仍然有点难看,您必须显式创建并返回一个对象 - 当使用普通构造函数时,创建和返回语句是隐式的 -> 这就是为什么你只在普通构造函数中键入this.type = xxx但需要返回工厂内部的语句和 object.create。
标签: javascript oop