2016-09-16 2 views
1

Я не могу понять, что здесь отсутствует.String Невозможно прочитать свойство «replace» of undefined

Я установил прототип строку в моем utils.js

String.prototype.toTitleCase =() => { 
    return this.replace(/\w\S*/g, (txt) => { 
     return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
}; 

И когда я проверить его от app.js

import * as utils from 'utils' 

"This is a test".toTitleCase(); 

Я получаю сообщение об ошибке: TypeError: Cannot read property 'replace' of undefined

Я думаю, прототипирование более чистое, чем создание функции для этого. Вот почему я хочу понять. Спасибо!

ответ

2

Проблема заключается в том, что вы использовали "Arrow function".

Функция стрелка выражение [...] лексически связывает это значение

Таким образом, значение this должно было undefined при создании функции. Он не был привязан к строковому объекту, на котором вы вызывали функцию.

Чтобы исправить это, используйте обычную функцию:

String.prototype.toTitleCase = (function() { 
    return this.replace(/\w\S*/g, (txt) => { 
     return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
}); 
+0

Спасибо! Я открываю es6, и я думаю, что они используют функции стрелок. –

+0

Функции стрелки великолепны, если вы хотите лексической привязки. Например, обычно приходится перепрыгивать через обручи, такие как 'var self = this;' для использования в цепочке обратного вызова или обещания. Там функции стрелки велики. Они не так хороши для определения прототипа, где вы хотите традиционную динамическую привязку 'this'. – dsh

0

Отлаживайте свой код, проверяйте консоль firebug с точкой останова на возвращаемой строке значением this, вы увидите, что this не является строкой, является объектом, представляющим ваш прототип String.

1

this является объект Window, если с помощью функции стрелка, перейти к нормальной функции, и она работает

String.prototype.toTitleCase = function() { 
    return this.replace(/\w\S*/g, (txt) => { 
     return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
}; 
Смежные вопросы