Почему я не могу изменить «это» в этом контексте? - PullRequest
0 голосов
/ 13 апреля 2020

В следующем случае я бы предположил, что значение this (которое является строкой) может быть изменено на другую строку. Таким образом, я мог бы эмулировать массив и просто написать string_var.shift(), чтобы удалить первый символ строки. Однако из того, что я собрал, это непреложно. Я не уверен, как еще я мог бы подойти к этой проблеме, если я не могу изменить значение строки. Я, конечно, мог бы вернуть результат, но тогда мне пришлось бы написать string_var = string_var.shift(), который имеет другой синтаксис для функции массива с тем же именем и в конечном итоге может привести к путанице.

Object.defineProperty(String.prototype, "shift", { value: function() {
     this = this.substr(1)
}})

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Есть две причины, по которым следующий код не будет работать. this не является переменной, это свойство контекста выполнения (глобального, функции или eval), которое в нестрогом режиме всегда является ссылкой на объект, а в строгом режиме может принимать любое значение. Синтаксически недопустимо присваивать ему что-либо.

Но, что более важно, невозможно реализовать метод мутации в интерфейсе String, поскольку строки, логические значения и числа являются неизменяемыми в Javscript, согласно спецификации ECMAScript , Когда вы «мутируете» значение, например, в контексте x += 5, за кулисами вы создаете новое значение, а не изменяете исходное.

0 голосов
/ 14 апреля 2020

Ну, вы можете вернуть значение после выполнения некоторых операций с ним

String.prototype.shift = function() {
  return this.slice(1);
};

var a = "abcdef";
console.log(a);
a = a.shift();
console.log(a);

Примечание: модификация прототипа самого языка считается плохой практикой

0 голосов
/ 14 апреля 2020

Вы не можете изменить this, так как это ключевое слово, а не переменная. Как и function или class

, вы можете присвоить это значение другой переменной: var self = this.substr(1) вместо

Также обратите внимание, что this context является внутренней функцией на этом этапе.

...