【发布时间】:2023-04-02 05:48:01
【问题描述】:
我有一个类实例,它的构造函数接受一个对象或代表该对象的 JSON 字符串。 *
因为 JSON 来自远程源,我喜欢确保所有属性的首字母都小写。但是我注意到我用来执行此操作的方法 (Object.keys()) 忽略了原型方法。阅读文档后,这是有道理的。我考虑了Object.getOwnPropertyNames(),但考虑到我不是在处理可枚举与不可枚举(据我所知),这不会有什么不同。
我可以使用另一种方法来小写所有键和原型方法的第一个字母吗?
谢谢。下面的演示。
class B {
constructor() {
this.MyProperty = "Hello world!";
}
MyMethod() {}
}
class A {
constructor(b) {
console.log(`MyMethod exists before lowercasing: ${!!b.MyMethod}`);
b = Object.keys(b).reduce((copy,key) => ({...copy, [`${key[0].toLowerCase()}${key.slice(1)}`]: b[key]}),{});
console.log(`MyMethod exists after lowercasing: ${!!b.myMethod || !!b.MyMethod}`);
console.log(`MyProperty has been lowercased: ${!!b.myProperty}`);
}
}
let b = new B();
let a = new A(b);
* 为简洁起见,我已将其删除。
【问题讨论】:
-
MyMethod实际上也是不可枚举的,所以是的,你应该处理它。 -
感谢您的提醒。也许我应该在这里用一块石头杀死两只鸟,然后将方法设置为属性。
-
TBH 我认为您的
A根本不应该处理这个问题。让它期待B实例,并合理地命名Bs 方法。仅在解析 JSON 时才对属性名称进行任何必要的转换,而不是在已经存在的对象上(或更糟的是,带有原型的实例)。 -
@Bergi 感谢您的意见。那我很可能会走那条路。如果有人对我提出的(被误导的)问题提交答案,我会保持打开状态,否则我会删除它。
-
对于您的原始问题,请采用我在List Down All Prototype Properties of an Javascript Object 中概述的方法(尽管我想您会想停在
Object.prototype,而不是null)
标签: javascript class object prototype