首页 > 解决方案 > 将键和原型方法转换为驼峰式

问题描述

我有一个类实例,它的构造函数接受一个对象表示该对象的 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);


*为简洁起见,我已将其删除。

标签: javascriptclassobjectprototype

解决方案


您可以使用从实例中获取原型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);


推荐阅读