【问题标题】:Convert keys and prototype methods to camelcase将键和原型方法转换为驼峰式
【发布时间】: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


【解决方案1】:

您可以使用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);

【讨论】:

  • 也许我理解错了,但这不会让我从只有钥匙但没有原型,到有只有原型但不是钥匙?
  • @Santi class methods 被声明为 原型的不可枚举属性,因此在您的情况下,您需要从原型访问它们.
  • 我明白这一点,我很欣赏这个答案,但是我正在尝试将我目前将键名小写的方法扩展为 also 小写原型方法。我上面的观点是,如果class B 具有构造函数和属性,那么它们似乎将不再在class A 中被复制/小写。我已经修改了我的示例以反映这一点。
  • @Santi 我的错,我现在明白你的问题了,你能看看我更新的答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
相关资源
最近更新 更多