Я экспериментировал с подклассом встроенного объекта String в ES2015 с использованием Node 5.3.0. Я запускаю код, не транслируемый, используя кучу флагов гармонии. Вот полная команда: node --harmony --harmony_modules --harmony_destructuring --harmony_rest_parameters --harmony_arrow_functions --harmony_spreadcalls --harmony_object --harmony_default_parameters --harmony_new_target --harmony_reflect --harmony_modules ~/t.js
Ошибка при создании подкласса Строковый объект
Учитывая, что спецификации конкретно говорит объект Строка, делается подклассы (смотрите раздел 21.1.1 The String Constructor
), я изо всех сил, чтобы понять, если это то, что я делаю неправильно или ошибка в узле или, возможно, даже в V8.
код воспроизвести проблему следующим образом:
'use strict';
class Str extends String {
capitalize() {
return `${this.slice(0, 1).toUpperCase()}${this.slice(1)}`;
}
}
var s = new Str('asdf');
console.log(s.constructor);
//[Function: String]
console.log(s.__proto__)
//[String: '']
console.log(s.capitalize());
//TypeError: s.capitalize is not a function
Код выше показывает, что цепочка прототипов не является установка, как я бы ожидать. Однако, если я вручную исправлю __proto__
, используя приведенный ниже код, все работает правильно.
'use strict';
class Str extends String {
constructor(...args) {
super(...args);
Object.setPrototypeOf(this, new.target.prototype);
}
capitalize() {
return `${this.slice(0, 1).toUpperCase()}${this.slice(1)}`;
}
}
var s = new Str('asdf');
console.log(s.constructor);
//[Function: Str]
console.log(s.__proto__);
//Str {}
console.log(s.capitalize());
//Asdf
Я действительно интересно знать, почему наследование не работает, как я ожидал.
Вы не фиксируете переданный аргумент в первом – dandavis
Я не могу ответить о расширении 'String', но' this.slice (0, 1) .toUpperCase() 'неверно. Вы, вероятно, хотите 'this.substr (0,1) .toUpperCase()'. – naomik
смешная вещь, первый код работает просто отлично в firefox ... – mido