Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用getter和方法返回对象的函数_Javascript_Defineproperty - Fatal编程技术网

Javascript 使用getter和方法返回对象的函数

Javascript 使用getter和方法返回对象的函数,javascript,defineproperty,Javascript,Defineproperty,我正在重构我的代码,并决定用独立的工厂函数替换ES6类。所以在改变之前,我有这样的想法: 班级人员{ 建造师(姓名){ this.name=名称; } 获取我的名字(){ 返回'My name if${this.name}'; } 说(){ console.log(this.myName); } } const john=新人(“john”); 约翰。说(); 然后改为: 职能人员(姓名){ 常量对象={ 名称 获取我的名字(){ 返回'My name if${obj.name}'; }, 说

我正在重构我的代码,并决定用独立的工厂函数替换ES6类。所以在改变之前,我有这样的想法:

班级人员{
建造师(姓名){
this.name=名称;
}
获取我的名字(){
返回'My name if${this.name}';
}
说(){
console.log(this.myName);
}
}
const john=新人(“john”);
约翰。说();
然后改为:

职能人员(姓名){
常量对象={
名称
获取我的名字(){
返回'My name if${obj.name}';
},
说(){
console.log(obj.myName);
},
};
返回obj;
}
const john=人(“约翰”);
约翰。说();
它的工作原理是一样的,但当我在Vue应用程序中使用它处理数千个这样的对象时,它的性能急剧下降。我尝试将数据、getter和方法拆分为不同的对象,然后返回它们的组合
{…data,…getter,…methods}
,但没有任何改变-我发现类的性能要高得多

在谷歌搜索之后,我发现可以通过
defineProperty
添加getter和方法:

职能人员(姓名){
常量对象={
名称
};
Object.defineProperty(obj,'myName'{
得到(){
返回'My name if${obj.name}';
}
});
Object.defineProperty(obj,'say'{
值(){
console.log(obj.myName);
}
})
返回obj;
}
const john=人(“约翰”);
约翰。说();
这个解决方案成功了,应用程序恢复了性能,但我不明白为什么。唯一的区别可能是,现在添加的属性不可枚举。但这怎么会成为问题呢


因此,我非常感谢您的解释,这可能是一个更好的解决方案。

工厂函数每次都返回一个新对象,其中包含所有属性作为自己的属性,而对于类,所有方法都从类继承到实例。不清楚为什么不应该使用该类。@EugeneBarsky:当使用
defineProperty
时,新属性在
writable
enumerable
configurable
中具有
false
值。尽管所有这些都是
true
和赋值(第1版)。在问题的上下文中,我无法想象给定的最后两个片段之间有任何性能(速度方面)的差异。如果对象在应用程序中大量迭代,那么lattest代码段的行为更像一个类,因为迭代器只迭代可枚举的自身属性(不包括
for..in
getOwnPropertyDescriptors
)。为什么不呢?迭代的复杂性是O(n),如果您有一个具有20个属性的对象,那么迭代所需的时间比仅迭代一个具有单个属性的对象要多20倍。即使有了这些示例,第二个代码段的迭代时间也是其他示例的3倍,然后你会将差异乘以数千,差异会从可忽略变为可标记。你如何在Vue.js应用程序中使用这数千个
Person
实例?如果没有看到代码,我们真的无法帮助您分析性能损失。