javascript - 将键和原型方法转换为驼峰式
问题描述
我有一个类实例,它的构造函数接受一个对象或表示该对象的 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);
*为简洁起见,我已将其删除。
解决方案
您可以使用从实例中获取原型Object.getPrototypeOf(instance)
,然后Object.getOwnPropertyNames()
在原型上调用以获取原型方法列表。
使用Array.prototype.reduce()
您可以将原型方法以及您提供的对象实例的键组合到一个对象中,然后应用您的小写逻辑:
class B {
MyMethod() { return true }
}
class A {
constructor(b) {
console.log(`MyMethod exists before lowercasing: ${!!b.MyMethod}`);
var proto = Object.getPrototypeOf(b);
var comp = Object.getOwnPropertyNames(proto).reduce((obj, key) => {obj[key] = proto[key]; return obj}, {...b})
b = Object.keys(comp).reduce((copy,key) => ({...copy, [`${key[0].toLowerCase()}${key.slice(1)}`]: b[key]}),[]);
console.log(`MyMethod exists after lowercasing: ${!!b.myMethod || !!b.MyMethod}`);
}
}
let b = new B();
let a = new A(b);
推荐阅读
- ios - Firestore NSArray 到 Swift.Array 匹配错误
- flutter - Flutter平台通道调用的两个方向?
- terraform - 使用 Terraform 时从实例获取 EC2 Windows 密码
- c++ - 如何创建函数来操作具有受保护或私有属性的对象内部的对象?
- c++ - 如何修复错误 C2259:无法实例化抽象类
- python - 如何提取多个 .zip 文件?
- python - 尝试错误更新表单时如何修复“'__proxy__'对象没有属性'get'”
- c++ - 如何用 C++ 给出的地址覆盖汇编程序堆栈的返回地址?
- php - 已弃用:strpos():将来非字符串针将被解释为字符串
- julia - Julia:模块中的全局变量