전역 객체의 내장 속성을 일부 삭제할 수있는 이유는 무엇입니까?


12

나는 요즘 es5를 읽고 전역 객체의 일부 내장 속성에서 [[configurable]] 속성이 true로 설정되어 있으며 이러한 속성을 삭제할 수 있음을 알았습니다.

예를 들면 다음과 같습니다.

Array.prototype 객체의 join 메소드에는 속성이 있습니다

{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}

따라서 다음과 같이 Array의 조인 방법을 쉽게 삭제할 수 있습니다.

delete Array.prototype.join;
alert([1,2,3].join);

경고는 undefined내 크롬 17, 파이어 폭스 9, 즉 10, 심지어 ie6에 표시됩니다.

Chrome 15 및 safari 5.1.1에서 [[configurable]] 속성이 true로 설정되고 결과 삭제도 true이지만 최종 결과는 여전히 function(){[native code]}입니다. 이것은 버그이며 크롬이 수정하는 것처럼 보입니다.

전에는 눈치 채지 못했습니다. 내 생각에 사용자 코드에서 내장 함수를 삭제하는 것은 위험하며 다른 사람들과 작업 할 때 너무 많은 버그가 발생합니다. 왜 ECMAScript 가이 결정을 내립니까?


여러 답변은 속성을 삭제하여 내장 기능을 사용자 정의하는 기능을 자랑하지만이 방법은 DI를 사용하는 대신 전역 변수로 기능이 연결되어 있기 때문에 필요합니다. 속성을 삭제하여 사용자 정의하는 것은 근본적으로 나쁜 디자인 주위의 해킹 인 것 같습니다. 예를 들어 JSON 파서를 변경해야하는 경우 JSON 파서를 입력으로 사용하는 코드를 작성할 수 있습니다.
복원 Monica Monica

답변:


2

나는 당신에게 동의하는 경향이 있지만, 반면 에 Firefox 3.5delete JSON.stringify버그로 인해 특정 상황에서 필요한 상황을 발견했습니다 . 나는 확실히 내장을 원숭이 패치하는 능력에 기뻤습니다.


왜 그냥 무시하지 않습니까?
demix

2
다음에 발생하는 일은 JSON2.js 가로 드되기 때문에 존재 여부를 감지하고 JSON.stringify필요한 경우 주입합니다. 사과, 나는 내 대답에 그것을 설명하지 않았다.
N3dst4

따라서 JSON2.js의 소스 코드도 수정할 수 있습니다. lol
demix

타사 라이브러리를 수정하면 모든 변경 사항을 복사하지 않고 업그레이드 할 수 없으므로 좋지 않습니다.
N3dst4

1

구성 가능은 삭제에 관한 것이 아닙니다.

읽기 전용 값을 바꾸는 기능 에 관한 것 입니다.

매우 강력한 도구이며 구성 할 수없는 값은 삭제할 수없는 경우 실망 스럽습니다.

모호한 버그를 수정하거나 약간 다른 기능 (차단, 로깅)을 주입해야하는 경우가 꽤있었습니다. 그렇게하려면 값을 교체 해야합니다.

예:

Object.defineProperty(Object.prototype, "foo", {
  value: 42,
  configurable: true
});

var o = {};
o.foo = 50; // fails. foo is not writable
delete Object.prototype.foo;
o.foo = 50; // succeeds
/* optionally put Object.prototype.foo back */

전체 아이디어는 속성을 삭제할 수 있으면 더 많은 메타 프로그래밍 제어 기능이 있다는 것입니다. 당신이 그들을 삭제할 수 없다면 당신은 단지 언어에 화가 얻을 것입니다.

사람들을 성가 시게하는 것보다 속성을 삭제할 수 없게 만드는 좋은 이유는 없습니다.


1
[[writable]] 속성은 값을 변경하는 기능을 제어합니다. ES5 : [[Writable]] Boolean false 인 경우 ECMAScript 코드에서 [[Put]]을 사용하여 속성의 [[Value]] 속성을 변경하려고 시도하면 성공하지 않습니다. . [[Configurable]] Boolean false 인 경우 속성을 삭제하려고 시도하거나 속성을 접근 자 속성으로 변경하거나 속성 ([[Value]] 이외)을 변경하면 실패합니다.
demix

@demix 예, 맞습니다 ...
Raynos

0

.. 사용자 코드에서 내장 함수 삭제는 위험합니다

꽤 대조적 인 것. 웹 사이트 제작자들이 더 많은 유연성을 가질 수 있기 때문에 커스터마이제이션을 허용하는 것이 좋습니다 .

웹 사이트 작성자가 동일한 JS VM 내에 타사 코드를로드해야 하고 내장 된 JS 파서를 사용하여 이를 구현 하려는 경우 타사 코드를로드하기 전에 항상 구성 할 수없는 속성으로 설정하여 속성을 보호 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.