由于IE11,我发现仍然无法自由使用class
。
所以我想使用prototypes
和object.create
来尽可能以最轻的方式创建我的问题。
但是我只发现Object.assign()
与var classDefiner = {
x: 1,
y: 2,
standardFunction : function() {
return this.x+this.y;
}
};
var istance = Object.assign({}, classDefiner ,{
x: 10,
z: 3,
customFunctionA : function() {
return this.x+this.y+this.z;
},
customFunctionB : function() {
return this.x/this.y;
}
});
合并,这是一种对象的合并,而不是一个inizializator。
classDefiner
老实说,这听起来只是{}
prototypes
中class
所有方法的冗余副本。
不能很好地使用object.create()
或{}
或class
。
这是正确的方式还是我可以改进的东西?
PS:挑战是不要声明任何单个函数/方法,而是使用istance
的{{1}}包装器和istance.newMethod
的另一个包装器,以便于阅读。我知道我可以使用newobject.prototype.newMethod
甚至{{1}}手动添加许多方法。但是如果要添加大量方法,这将是漫长而混乱的。
答案 0 :(得分:1)
我猜你的意思是:
function classDefiner() {
this.x = 1;
this.y = 2;
};
classDefiner.prototype.standardFunction = function() {
return this.x+this.y;
}
var a = new classDefiner();
a.standardFunction(); //3
答案 1 :(得分:1)
如果您想通过复制属性来实现,那么您使用Object.assign
所做的事情可能就像现在一样干净。 (请注意,您必须在IE11上填充Object.assign
,但它是完全可填充的。)一个调整是您可以使用方法语法而不是函数的属性初始化语法:
var instance = Object.assign({}, classDefiner ,{
x: 10,
z: 3,
customFunctionA() { // ***
return this.x+this.y+this.z;
},
customFunctionB() { // ***
return this.x/this.y;
}
});
ES2018将为我们提供在上面替换Object.assign
的语法:
var instance = {
...classDefiner, // ***
x: 10,
z: 3,
customFunctionA() {
return this.x+this.y+this.z;
},
customFunctionB() {
return this.x/this.y;
}
};
(当然,如果不进行转换,这将无法在IE11上运行。:-))技术上the proposal for it目前只是第3阶段,但它可能是在第4阶段之后的第4阶段1月TC39会议,已在V8(在Chrome中)和SpiderMonkey(在Firefox中)实施。
如果您想通过继承来实现这一目标,那么您使用Object.create
走在了正确的轨道上:
var classDefiner = {
x: 1,
y: 2,
standardFunction() {
return this.x+this.y;
}
};
var instance = Object.assign(Object.create(classDefiner), {
x: 10,
z: 3,
customFunctionA() {
return this.x+this.y+this.z;
},
customFunctionB() {
return this.x/this.y;
}
});
// Demonstrating it
console.log(instance.standardFunction());
console.log(instance.customFunctionA());
无论是复制属性还是继承属性,我都会说无论是哪种方式都没有。
赞成继承:
instance
之后,您添加或修改了classDefiner
,则这些更改将反映在instance
中(因为它继承而不是复制)。 赞成复制: