工厂函数vs Object.create-JavaScript-何时使用哪个
我已经读了很多关于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
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”})