工厂函数vs Object.create-JavaScript-何时使用哪个

工厂函数vs Object.create-JavaScript-何时使用哪个,javascript,Javascript,我已经读了很多关于JavaScript中的对象组合以及这种模式相对于“类”模式的优势的书。我看到过使用Object.create()创建新对象的合成示例,以及使用返回对象的工厂函数演示的其他示例 Object.create示例: var Component = { init: function() { // do stuff } }; var button = Object.create(Component); button.init(); 工厂功能示例: var Comp

我已经读了很多关于JavaScript中的对象组合以及这种模式相对于“类”模式的优势的书。我看到过使用
Object.create()
创建新对象的合成示例,以及使用返回对象的工厂函数演示的其他示例

Object.create示例:

var Component = {
  init: function() {
    // do stuff
  }
};

var button = Object.create(Component);

button.init();
工厂功能示例:

var ComponentFactory = function() {
   return {
     init: function() {
       // do stuff
     }
  }
}

var button = ComponentFactory();

button.init();

我知道工厂函数旨在抽象出创建对象所涉及的复杂性,但是我试图理解
Object.create()
和返回对象的函数之间是否有实际区别。

I.Object.create

Object.create
create Object from prototype在属性中给出,因此如果我们在从
Object.create.create创建的对象上选中
hasOwnProperty
,我们将看到它没有属性(每个属性都在其prototype中)

因此,
object.create(SomeObj)
创建的每个对象都与同一个原型链接,这会产生一些后果,例如原型中的复杂对象可以在每个实例上更改,而更改在其他实例上可见

结论-Object.create与继承类似。

显示我所说内容的示例代码:

var obj={
complexProp:{
姓名:“约翰”,
姓氏:“Doe”
},
您好:函数(){
log(“Hello”+this.complexProp.name+“”+this.complexProp.name);
}
};
var objA=Object.create(obj);
var objB=Object.create(obj);
log(objA.hasOwnProperty(“complexProp”)//假的
objA.complexProp.name=“Smith”//objA的变化

objB.hello()//因此,我们看到objB中也有变化,工厂函数创建具有自己属性的对象,
Object.create
创建具有指定属性的对象

在您的示例中,由
ComponentFactory
创建的每个对象都有自己的
init
(对内存中不同位置的引用),
对象。create(Component)
创建对同一原型的对象引用(
Component

Object.create
由于不创建属性,因此占用的空间/内存更少。将其用于对象的公共部分

const Component = {init() {}}
const x = Object.create(Component)
const y = Object.create(Component)

console.log(x.init === y.init) //true


function createComponent(data) {
  return {
    init() { return data }
  }
}

const p = createComponent('a')
const q = createComponent('b')
console.log(p.init === q.init) //false
console.log(p.init()) //a
console.log(q.init()) //b
Factory函数更灵活,可以创建具有初始数据的对象,并在中创建局部变量。将其用于对象的自定义部分

const Component = {init() {}}
const x = Object.create(Component)
const y = Object.create(Component)

console.log(x.init === y.init) //true


function createComponent(data) {
  return {
    init() { return data }
  }
}

const p = createComponent('a')
const q = createComponent('b')
console.log(p.init === q.init) //false
console.log(p.init()) //a
console.log(q.init()) //b

正如其他人提到的,Object.create()允许您创建具有某种关系的对象,而函数工厂不允许。实际上,我认为Object.create是工厂函数的一种形式,只是该函数必须创建具有相同属性的对象。考虑这两种情况:

Object.create:
const Staff={
设置:函数(名称,idno){
this.name=名称;
this.idno=idno;
this.office=“未分配”
this.category=“Staff”;
此参数为“.acomodation=”“
}
};
james=Object.create(Staff);
james.setUp(“jamesblack”,1)
console.log(james.name)//jamesblack
console.log(james.idno)//1
//现在,让我们假设我们想要改变每年招聘和解雇的10000名员工。一个条件是我们所有的员工都是20岁。
我们只是说*/
职员年龄=20

console.log(james.age)//20
不是非此即彼。你应该使用。工厂函数(或构造函数)的全部要点是你不需要
.init()
方法!我们可以在Object.create中使用Object.freeze来避免其他实例中的更改吗?像这样
complexProp:Object.freeze({name:“John”,姓氏:“Doe”})