Где, во что и сколько слов надо обернуть:
const className = 'heading';
const wrapperTag = 'span';
const wrapCount = 3;
Оборачиваем:
document.querySelectorAll(`.${className}`).forEach(n => {
const words = n.innerText.split(' ');
const iMin = Math.max(0, Math.floor((words.length - wrapCount) / 2));
const iMax = Math.min(words.length - 1, iMin + wrapCount - 1);
words[iMin] = `<${wrapperTag}>${words[iMin]}`;
words[iMax] = `${words[iMax]}</${wrapperTag}>`;
n.innerHTML = words.join(' ');
});
или
for (const n of document.getElementsByClassName(className)) {
const words = n.textContent.split(/(?= )/);
const wrapper = document.createElement(wrapperTag);
wrapper.textContent = words
.splice(Math.max(0, (words.length - wrapCount) >> 1), wrapCount, wrapper)
.join('');
n.replaceChildren(...words);
}