В ES3 удаление представлено в 8.6.2.5 и 11.4.1 следующим образом:
Есть некоторая информация,
1. Оператор удаления в реализации вызовет метод [[Delete]] внутри движка.
2. [[Удалить]] определено в 8.6.2.
3. Удаленный атрибут имеет функцию DontDelete. В этом случае при удалении будет возвращено значение false.
Найдите «DontDelete», и вы найдете множество. Ничто из следующего не может быть удалено.
1. Активируйте аргументы объекта (10.1.6)
Скопируйте код кода следующим образом:
функция func() {
удалить аргументы;
предупреждение (аргументы);
}
функция(1);
2. Объявление переменной (10.2.1)
Скопируйте код кода следующим образом:
вар а = 10;
удалить а;
предупреждение(а); // 10;
Этот пункт упоминается во многих книгах по JS, то есть переменные, объявленные с помощью var, удалить невозможно.
3. Объявление функции
Скопируйте код кода следующим образом:
функция func() {}
удалить функцию;
предупреждение(функ); // код функции
4. Атрибут длины функции
Скопируйте код кода следующим образом:
функция func(a, b) {}
удалить func.length;
оповещение(func.length); // 2
5. Некоторые константы (NaN, Infinity, неопределенные)
Скопируйте код кода следующим образом:
удалить НЭН // ложь;
удалить бесконечность // ложь;
удалить неопределенное // ложь;
6. Прототип встроенного конструктора
Скопируйте код кода следующим образом:
удалить Object.prototype // ложь;
удалить Function.prototype // ложь;
удалить Array.prototype // ложь;
удалить ExpReg.prototype // ложь;
удалить Date.prototype // ложь;
удалить Error.prototype // ложь;
удалить Number.prototype // ложь;
удалить Boolean.prototype // ложь;
удалить String.prototype // ложь;
7. Длина массивов и строк
Скопируйте код кода следующим образом:
вар arr = [], str = 'привет';
удалить длину массива // ложь;
удалить стр.длину // ложь;
8. Свойства объекта Math (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
Скопируйте код кода следующим образом:
удалить Math.E // ложь;
...
9. Свойства обычных объектов (source, global, ignoreCase, multiline, LastIndex)
Скопируйте код кода следующим образом:
вар рег = /сс/;
удалить reg.source // ложь;
...
ES5 отличается от ES3. В ES5 нет параметра «DontDelete», но добавлен [[Configurable]] (8.6.1).
Если значение false, его нельзя удалить. Девять пунктов, перечисленных выше, описаны в ES5 как [[Configurable]] — false.
Новый метод Object.defineProperty в ES5 может отображать конфигурируемый объект определенного объекта следующим образом:
Скопируйте код кода следующим образом:
вар obj = {имя: 'Джон'};
Object.defineProperty(obj, "ключ", {
настраивается: ложь,
значение: «статический»
});
удалить имя объекта // true;
удалить obj.key // false
Объект obj имеет имя и ключ. Имя можно удалить, а ключ нельзя.
Кроме того, в строгом режиме ES5 исключение будет выдано непосредственно при удалении объекта, настраиваемый параметр которого имеет значение false. нравиться
Скопируйте код кода следующим образом:
«используйте строгий»;
удалить Object.prototype;
Ошибка консоли в FF следующая:
Помимо некоторых методов или свойств встроенных объектов, которые невозможно удалить, существуют также пользовательские объекты, которые невозможно удалить. Например, команда delete не может удалить объект, который наследует свойства прототипа.
Скопируйте код кода следующим образом:
функция Человек() {}
Person.prototype.name = 'Джон Бэкус';
вар р = новый человек ();
удалить имя п.;
console.log(p.name); // Все еще выводим Джон Бэкус
Если на этом и прототипе есть имя, то после удаления отобразится прототип.
Скопируйте код кода следующим образом:
функция Человек() {
this.name = 'Джон Бэкус';
}
Person.prototype.name = 'Джон Резиг';
вар р = новый человек ();
console.log(p.name); // Джон Бэкус
удалить имя п.;
console.log(p.name); // Джон Резиг, из прототипа
Если вам нужно удалить имя на прототипе, вы можете только
Скопируйте код кода следующим образом:
удалить Person.prototype.name
Подводя итог:
1. Большинство свойств и методов встроенных объектов удалить нельзя (хотя некоторые можно удалить, например isNaN и parseInt)
2. Свойства и методы, которые объект наследует от прототипа, удалить невозможно.
Причина тоже очень проста:
1. Большинство свойств и методов встроенных объектов нельзя удалить, чтобы защитить основной API языка. После удаления эти API становятся практически бесполезными. Например, удалить Object.prototype.
2. Атрибуты и методы, которые объект наследует от прототипа, не могут быть удалены для защиты прототипа. В противном случае «если объект класса A удалит атрибут прототипа, то все объекты, унаследованные от A, потеряют атрибут».