확장 js 원본 대상의 정확한 자세
4975 단어 웹 프런트엔드
선언
우선 개인은 원생 대상을 수정하는 것을 추천하지 않는다.두 가지 이유가 있습니다.
그러나 프로젝트에서 이런 상황을 만날 수 있다. 원생의 js 대상은 수정되었지만 수법은 매우 졸렬하다.
그럼 시작합시다.여기서 우리는 Array를 예로 들자.
2 부정확한 자세
2.1 Array.method
이렇게 하면array 대상에 새로운 방법을 추가할 수 없습니다.
2.2 Array.prototype.method
메소드 메소드를 추가했고, 그 다음에 새로 만든 모든 Array 대상에 메소드라는 메소드가 추가되었습니다.
Array.prototype.method = function(){
console.log('I am an user defined method!');
}
var a = [];
a.method();
console에서 I am an user defined method 가 출력되었습니다.완벽해 보이네.
그러나 우리가 for in을 이 그룹을 두루 훑어보았을 때,method도 결과에 나타난 것을 발견했다.이것은 분명히 우리가 바라는 결과가 아니다.
for(x in a){
console.log(x+':'+a[x])
}
console에서 출력됨:
method:function (){
console.log('I am an user defined method!');
}
보아하니 이런 방법은 부작용이 있는 것 같다.앞으로 for in을 사용할 때 이 method를 수동으로 필터해야 합니다.
예를 들어 typeof를 이용하다
for(x in a){
if(typeof a[x] === 'function') continue;
console.log(x+':'+a[x])
}
3 바른 자세
이것이 올바른 방법입니다. 먼저 코드를 올리십시오.
Object.defineProperty(Array.prototype,'method',{
writable:false,
enumerable:false,
configurable:true,
value:function(){
console.log('I am an user defined method!');
}
});
효과가 있는지 없는지는 여러분이 직접 시도해 보셔도 됩니다. 다음은 그 중의 매개 변수를 설명해 드리겠습니다.
한 번에 여러 속성을 정의하려면
Object.defineProperties(Array.prototype,
{
method1:{
writable:true,
enumerable:false,
configurable:true,
value:function(){
console.log('I am an user defined method 1!');
}
},
method2:{
writable:true,
enumerable:false,
configurable:true,
value:function(){
console.log('I am an user defined method 2!');
}
}
}
);
이런 방식은 동적 함수 이름을 전달하기에 불편하다는 것을 주의해라.
4 요약
JavaScript는 원본 클래스의 속성을 수정하고 확장할 수 있으며, 수정 가능, 열거 가능, 설정 가능 등 속성의 특성에 대한 선택을 제공합니다.이러한 속성의 조합을 통해 실제 수요에 더욱 부합되는 유형을 설계할 수 있다.예를 들어 우리는 Person 종류를 설계할 수 있는데, Person의 성별이 초기화된 후에 다시 수정하는 것을 허락하지 않는다. (개별적인 상황은 허용된다.)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
highcharts 데이터 테이블 설정 두 가지 등효 방식의 쓰기텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.