Где и как я должен расширить прототип String в приложении Angular? - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы расширить прототип String и использовать его в одном или нескольких компонентах моего приложения Angular 5. Основная причина в том, что у меня есть ряд объектов, которые имеют свойства, которые иногда заполняются, а иногда нет. Пример: customer.address иногда является string (_id адреса), а иногда он заполняется и является Address объектом со свойством _id.

Что я хочу, так это то, что мне не нужно беспокоиться о том, заполнен ли customer.address или нет, и просто получить доступ к _id. Я знаю, что это считается анти-паттерном Javascript согласно некоторым другим ответам здесь , но я подумал сделать что-то вроде этого:

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

Независимо от того, насколько плоха идея - на которую уже отвечали другие вопросы, - будет ли это способом сделать это, и где я должен это объявить? Есть ли лучший способ решения этой проблемы?

Спасибо.

PS. Я знаю, что мог бы также перезаписать метод toString в своем классе Address и получить аналогичный результат, вызвав customer.address.toString(), чтобы получить _id, но я чувствую, что он не читается, и я хотел бы изучить другие варианты первый.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Возможно, вы захотите использовать Proxy , который обернет ваш объект и предоставит средства для перехвата пропущенных значений и многое другое.

В приведенном ниже примере показано, как достичь желаемой функциональности.без необходимости расширения каких-либо встроенных типов.

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 голосов
/ 21 января 2019

Исходя из этого и моего опыта, я бы посоветовал вам поставить вот так, если ваше приложение AngularJS:

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

Для Angular 2+ вы можете проверить this и отметьте эту запись стекового потока, в которой рассказывается, как расширить свойства String в Typescript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...