댓글 쓰는 것이 제 장점은 아니니 궁금한 점은 댓글로 적어주세요:D
]
In 코드를 쉽게 이해하기 위해, 그리고 공개 변수와 비공개 변수를 더 잘 구별하기 위해 보통 set... 메소드(...특정(일부) 멤버 변수의 경우)를 사용하여 클래스의 멤버에 값을 할당합니다. 이러한 설정 방법은 물론 공개됩니다. 또 다른 점은 코드를 더욱 표준화하는 것입니다.
그러나 문제는 여기에 있습니다. 위의 코드가 검증 유효성을 고려하지 않는 경우(또는 단순 유효성만 검증하는 경우) 20개의 멤버(속성)가 있는 클래스를 상상해 보십시오. 그런 다음 20개의 set... 메소드를 추가해야 하는데 이는 정말 중복되므로 이 문제를 해결할 방법을 찾아야 합니다.
Mozilla에는 DOM에 멤버를 추가하는 __defineSetter__ 및 __defineGetter__ 메서드가 있어 개발자에게 많은 편의를 제공합니다. __defineSetter의 js 버전도 모방해 보겠습니다.
간단한 아이디어:
JS를 사용하여 객체에 메서드(또는 속성)를 동적으로 추가합니다.
하지만 클래스에 set... 메서드를 추가할 필요는 없습니다.
[a-z] 범위에 없는 속성은 더 이상 set... 메소드를 추가하지 않습니다.
구현 코드 작성
]
_defineSetter는 기본적으로 구현되어 있는데, Setter를 하나씩 정의하는 것은 너무 번거로울 것입니다. 이제 프로토타입이 구현되었으므로 프로토타입을 사용하여 Function 개체에 동적으로 바인딩합니다. 한 줄의 코드로 set.. 메서드를 해결할 수 있습니다.
Function.prototype.defineAllSetter = function (hdle) {
for (var i in this.prototype)
_defineSetter.apply(this, [this,i,hdle])
return this;
};
다음 단계는 DefineSetter를 Function 객체에 바인딩하는 것입니다.
Function.prototype.defineSetter = function (p, hdle) {
return _defineSetter.apply(this,
[this].concat(Array.prototype.slice.call(arguments) ,0)));
};
기본적으로 원하는 기능이 완성되었습니다. 한번 해보세요...
외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
]
DEMO 및 모두 이 예의 코드는 다음과 같습니다.
http://www.never-online.net/code/js/defineSetter/ <script>
function jsclass() {};
jsclass.prototype = {
value: "never-online", //属性1
URL: "www.url.net", //属性2
setValue: function (v) { //set方法
this.value = v;
},
setURL: function (v) { //set方法
if (/^www\.[a-z]|\-{2,}\.net|com$/i.test(v)) {
this.URL = v;
}
},
print: function () { //打印
alert(this.value);
alert(this.URL);
}
}
var o = new jsclass();
o.setValue("never-online'blog");
o.setURL("www.never-online.net");
o.print()
</script>물론 검증도 추가할 수 있습니다~, 더 구체적인 코드는 작성하지 않겠습니다. , 하하, 구현되었습니다. 관심 있는 친구들도 플레이해 보세요. :D.