2016-01-05 9 views
4

Я экспериментировал с подклассом встроенного объекта 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

Я действительно интересно знать, почему наследование не работает, как я ожидал.

+0

Вы не фиксируете переданный аргумент в первом – dandavis

+0

Я не могу ответить о расширении 'String', но' this.slice (0, 1) .toUpperCase() 'неверно. Вы, вероятно, хотите 'this.substr (0,1) .toUpperCase()'. – naomik

+0

смешная вещь, первый код работает просто отлично в firefox ... – mido

ответ

1

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

Вы можете зафиксировать цепочку прототипов при наследовании от строки встроенного используя следующей строки в constructor():

Object.setPrototypeOf(this, new.target.prototype);

new.target.prototype бита убедитесь, что вы должны наследовать дальше от вашего собственного типа прототипа цепь будет оставаться правильной.

 Смежные вопросы

  • Нет связанных вопросов^_^