Хорошо, так что это может быть лучшим вариантом для мелкого копирования. Если следовать много примеров с использованием assign, но он также сохраняет наследование и прототип. Это также очень просто и работает для большинства массивов и объектов, за исключением тех, которые имеют требования конструктора или свойства только для чтения. Но это означает, что он с треском проваливается для версий примитивов TypedArrays, RegExp, Date, Maps, Sets и Object (Boolean, String и т. Д.).
function copy ( a ) { return Object.assign( new a.constructor, a ) }
Где a
может быть любым экземпляром, созданным Объектом или классом, но опять-таки не может быть надежным для штуковин, которые используют специализированные методы получения и установки или имеют требования к конструктору, но для более простых ситуаций это качается. Это работает на аргументы, а также.
Вы также можете применить его к примитивам, чтобы получить странные результаты, но потом ... если только это не окажется полезным хаком, кого это волнует.
результаты от базовых встроенных объектов и массивов ...
> a = { a: 'A', b: 'B', c: 'C', d: 'D' }
{ a: 'A', b: 'B', c: 'C', d: 'D' }
> b = copy( a )
{ a: 'A', b: 'B', c: 'C', d: 'D' }
> a = [1,2,3,4]
[ 1, 2, 3, 4 ]
> b = copy( a )
[ 1, 2, 3, 4 ]
И терпит неудачу из-за среднего значения get / setters, конструктору требуются аргументы или свойства только для чтения и грехи против отца.
> a = /\w+/g
/\w+/g
> b = copy( a ) // fails because source and flags are read-only
/(?:)/
> a = new Date ( '1/1/2001' )
2000-12-31T16:00:00.000Z
> b = copy( a ) // fails because Date using methods to get and set things
2017-02-04T14:44:13.990Z
> a = new Boolean( true )
[Boolean: true]
> b = copy( a ) // fails because of of sins against the father
[Boolean: false]
> a = new Number( 37 )
[Number: 37]
> b = copy( a ) // fails because of of sins against the father
[Number: 0]
> a = new String( 'four score and seven years ago our four fathers' )
[String: 'four score and seven years ago our four fathers']
> b = copy( a ) // fails because of of sins against the father
{ [String: ''] '0': 'f', '1': 'o', '2': 'u', '3': 'r', '4': ' ', '5': 's', '6': 'c', '7': 'o', '8': 'r', '9': 'e', '10': ' ', '11': 'a', '12': 'n', '13': 'd', '14': ' ', '15': 's', '16': 'e', '17': 'v', '18': 'e', '19': 'n', '20': ' ', '21': 'y', '22': 'e', '23': 'a', '24': 'r', '25': 's', '26': ' ', '27': 'a', '28': 'g', '29': 'o', '30': ' ', '31': 'o', '32': 'u', '33': 'r', '34': ' ', '35': 'f', '36': 'o', '37': 'u', '38': 'r', '39': ' ', '40': 'f', '41': 'a', '42': 't', '43': 'h', '44': 'e', '45': 'r', '46': 's' }