在Angular应用程序中,我应该在哪里以及如何扩展String原型?

3
我想扩展String原型并在我的Angular 5应用程序的一个或多个组件中使用它。主要原因是我有一系列对象,它们具有属性,有时被填充,有时不被填充。例如:customer.address有时是string(地址的_id),有时它被填充并且是一个Address对象,带有一个_id属性。
我想做的基本上是不必担心客户地址是否已填充,只需访问_id。据其他响应这里称,这被认为是JavaScript反模式,但我考虑了做以下事情:
String.prototype._id = function () {
    return String.prototype.valueOf()
}

无论这个想法有多糟糕(已在其他问题中回答),这是否是一种实现方式?我应该在哪里声明它?有更好的解决方法吗?
谢谢。
附言:我知道我也可以重写我的Address类中的toString()方法并获得类似的结果,调用customer.address.toString()来获取_id,但我觉得这不太易读,我想先探索其他选项。

1
我仍然认为你根本不应该这样做 :-) 但如果你坚持,你可能想要一个getter,而不是将函数添加到String.prototype - str
谢谢评论!我可能不会这样做,但我仍然很想知道最好的方式和缺点。最后,也许我只会创建某种实用函数。 - RTYX
2个回答

0

你可能想考虑使用一个代理来包装你的对象,并提供一种捕获缺失值和更多功能的方法。

下面的示例展示了如何在不扩展任何内置类型的情况下实现所需的功能。

let customer1 = {
  address: 'some string'
}

let customer2 = {
  address: {
    _id: '12345'
  }
}


let proxyCustomer = customer => new Proxy(customer, {
  get: (target, name) => {
    // define the properties to catch and their functions
    let propHandlers = {
      address: () => {
        a = target.address
        // decide what you want to do
        // in this example a string value is returned as a dummy object with an _id.
        return typeof a === 'string' || a instanceof String ?
          {_id: a} : a
      }
    }

    // default action - return prop
    let def = () => target[name]

    // assign function to handleProp if it exists or use the default (return named prop)
    let handleProp = propHandlers[name] || def

    // return result of handle call
    return handleProp();
  }
})

// wrap customer objects in proxy
customer1 = proxyCustomer(customer1)
customer2 = proxyCustomer(customer2)

// test
console.log(customer1.address._id)
console.log(customer2.address._id)


0

基于this和我的经验,如果你的应用程序是AngularJS,我建议你这样做:

yourApp.run(function() { 
   String.prototype._id = function () {
     return String.prototype.valueOf()
   } 
}); 

对于 Angular 2+,您可以查看 this 并查看 这篇stackoverflow帖子,该帖子告诉您如何在 TypeScript 上扩展字符串属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接