객체의 메소드 참조
객체의 속성중 함수자료형인 속성을 메소드라고 부름
(객체 내부에 존재하는 함수를 메소드라 부름)
객체의 메소드를 참조하는 방법
: 객체이름.메소드이름()
메소드를 참조할 때 메소드 이름 뒤에 괄호(())를 붙이지 않으면,
메소드가 아닌 프로퍼티 그 자체를 참조하게 됨
.따라서 괄호를 사용하지 않고 프로퍼티 그 자체를 참조하게 되면 해당 메소드의 정의 그 자체가 반환
같은 객체 내 속성 호출
함수 실행코드 중 같은 객체 내 속성 호출시 경우 this.을 앞에 붙여야함
==> 만약 속성명과 변수명이 동일한 경우 this.를 붙이지 않으면 변수가 호출됨
<button onclick="test4();">실행확인</button>
<div id="area4" class="area small"></div>
<script>
function test4(){
var area4 = document.getElementById('area4');
var name='가나다';
var cat = {
name : '고순이',
kind : '길냥이',
eat: function(food){// 이 경우 속성명이 function의 이름이 되므로 익명함수로 작성
area4.innerHTML += this.kind +'종류인'+this.name+'가'+food+'를 먹고있어요.<br>';
// 메소드 속성 안에서 같은 객체 내의 속성을 호출할 경우 this.을 앞에 붙여야함
// 만약 속성명과 변수명이 동일한 경우 this.을 안붙이면 변수가 호출됨
}
};
cat.eat('츄르');
}
</script>
*** 속성의 속성값으로 일반 값(연산식)이 아닌 함수를 대입하는 이유:
일반 연산식을 속성값으로 대입하게 되면,
클래스 내 { 속성: 속성값} 으로 기입되는 순간 속성=속성값이 대입되므로
추후 속성값이 덮어쓰기로 변경되었을 경우 변경된 속성값을 인지하지 못하며, 원 대입값이 유지된다
반면,
속성값으로 함수를 사용하게 되면,
클래스 { 속성 : 함수() } 에서 속성=함수 (가변) 이 대입되므로
해당 함수가 호출되는 순간의 속성값을 가져오게 되어
추후 속성값이 덮어쓰기로 변경되었을 경우 변경된 속성값을 인지한다
toString메소드 오버라이딩
객체 내 toString메소드는 Object프로토타입의 toString()메소드를 이어받음
Object프로토타입의 toString()
- 출력문에서 toString생략가능
- 출력시 object Object 반환
- 일반적으로 오버라이딩하여 해당 객체의 모든 속성값을 반환하도록 재정의
이름: <input type="text" id="name"><br>
국어: <input type="text" id="kor"><br>
수학: <input type="text" id="math"><br>
영어: <input type="text" id="eng"><br>
<button onclick="test5();">실행확인</button>
<div id="area5" class="area big"></div>
<script>
function test5(){
var name= document.getElementById('name').value;
// 요소객체
var kor= Number(document.getElementById('kor').value);
// Number형으로 형변환 하지 않을시 text형임
var math= Number(document.getElementById('math').value);
var eng= Number(document.getElementById('eng').value);
var student = {
name : name,
kor: kor,
math: math,
eng : eng,
getSum: function(){
return this.kor+this.math+this.eng;
// Number형으로 형변환을 안했다면 문자+문자+문자 = 문자! 였을것,,
// --> + 산술연산 불가 (NaN)
},
getAvg: function(){
return this.getSum()/3;
},
toString : function(){
return this.name + ','+ this.kor + ','+this.math +','+this.eng;
} // object프로토타입의 toString -> [object object] 반환
// 따라서, 객체의 각 속성값을 반환받으려면 toString속성을 오버라이딩하여야함
};
console.log(student);
* in과 with
in: 객체가 가지고 있는 프로퍼티 및 메소드의 존재 여부를 Boolean으로 반환
특정 메소드, 프로퍼티 key값 이름의 존재 여부를 검증하기 위한 목적으로 사용
존재하지 않는 메소드, 프로퍼티 동작시 에러 발생 --> 사전확인 목적
[표현법]
'속성명' in 객체명
반환타입: boolean
객체 내 해당 속성이 존재할 시 true
존재하지 않을 시 false
with: 객체 제어문, 코드를 줄여주는 키워드
객체에 포함된 속성이나 메소드를 여러 번 사용해야할 때
with문을 이용하게 되면 반복적인 코드를 생략
단, with키워드를 이용한 객체 속성 추가는 불가함 (getter역할은 가능)
[표현법]
with (반복이 발생하는 객체명A) {
원 코드에서 A를 제외한 코드
}
var area5 = document.getElementById('area5')
area5.innerHTML += 'student: ' + student +'<br>'; // student: [object Object]
area5.innerHTML += 'student: ' + student.toString() +'<br>'; // student: [object Object]
// 해당객체에 해당 속성이 존재하나? => 속성명 in 객체명 : 있으면 true, 없으면 false
area5.innerHTML += 'student에 name 속성이 존재하나? : '+('name' in student) + '<br>'; // true
area5.innerHTML += 'student에 kor 속성이 존재하나? : '+('kor' in student) + '<br>'; // true
area5.innerHTML += 'student에 math 속성이 존재하나? : '+('math' in student) + '<br>'; // true
area5.innerHTML += 'student에 eng 속성이 존재하나? : '+('eng' in student) + '<br>'; // true
area5.innerHTML += 'student에 test 속성이 존재하나? : '+('test' in student) + '<br>'; // false
// 괄호를 붙이지 않으면 연산자우선순위때문에 앞 문자열과 name이 붙어버림
area5.innerHTML += 'student.name'+student.name+'<br>';
area5.innerHTML += 'student.kor'+student.kor+'<br>';
area5.innerHTML += 'student.name'+student.name+'<br>';
area5.innerHTML += 'student.kor'+student.kor+'<br>';
// 해당 객체의 속성에 반복하여 접근할 때- with (객체명)(속성명으로만 접근)
with(student){
area5.innerHTML += '학생이름: '+ name +'<br>';
area5.innerHTML += '국어점수: '+ kor +'<br>';
area5.innerHTML += '수학점수: '+ math +'<br>';
area5.innerHTML += '영어점수: '+ eng +'<br>';
area5.innerHTML += 'toString: '+ toString() +'<br>';
area5.innerHTML += 'getSum: '+ getSum() +'<br>';
area5.innerHTML += 'getSum: '+ getAvg() +'<br>';
}
// 출력문 작성시 toString메소드가 있으면
// 객체를 출력하면 toString메소드가 붙음(배열과 마찬가지)
}
//JavaScript
// typeof:string, number, boolean, function, object (배열, 객체)
</script>
객체의 속성 **추가 및 제거
추가
[표현법]
객체명.속성명 = 속성값;
객체명['속성명']= 속성값;
제거
[표현법]
delete(객체명.속성명);
delete(객체명['속성명']);
<button onclick="test6();">실행확인</button>
<div id="area6" class="area small"></div>
<script>
function test6(){
// 빈 배열 생성
var arr = [];
// 빈 객체
var student = { };
// *객체의 속성을 추가하는 방법
// 객체.속성명 = 속성값;
student.name = '홍길동';
console.log(student);
// name:"홍길동"
student.hobby = ['등산'];
student.dream = ['선생님'];
student.age = 18;
// 주의사항: 속성추가시 속성명이 중복된다면? : 덮어쓰기!
student.dream = '돈많은 백수';
console.log(student);
//with 키워드를 쓴다면?
with (student){
address = '한양';
phone = '010-123-2345';
}
// 불가능!! with 키워드로 속성 추가는 불가능함/ 속성값을 가져오는 getter용도로만 사용
document.getElementById('area6').innerHTML = student+'<br>'; // [object Object]
// object 프로토타입의 toString메소드를 이어받음
// 내부적으로는 toString메소드가 붙어서, student.toString()
// 따라서 원래 [object Object]라고 나오는 toString을 오버라이딩
student.toString = function(){
return 'name : '+this.name + '<br>';
+ 'hobby: '+this.hobby +'<br>';
+ 'dream: '+this.drea +'<br>';
+ 'age: '+ this.age + '<br>'
}
// this: 나 자신이라는 객체에 접근한 것!
// this.name 나 자신이 가지고 있는 name 속성에 접근한 것
document.getElementById('area6').innerHTML += student; // [object Object]
// 객체의 속성 제거
// delete(객체명.속성명) : 객체의 속성을 제거할 수 있는 함수
delete(student.toString);
document.getElementById('area6').innerHTML += student;
console.log(student);
//toString요소가 제거된 후에는, 오버라이딩한 속성이 사라졌으므로
// 프로퍼티로부터 프로퍼티 속성으로 출력됨
/// 프로퍼티로부터 속성을 물려받는건가..? toString은 속성을 물려받은것?
}
</script>
'JavaScript' 카테고리의 다른 글
[javaScript] 이벤트 (0) | 2022.11.07 |
---|---|
[jQuery] jQuery선택자 (0) | 2022.11.01 |
[JavaScript] 객체1: 객체란 / 프로퍼티, 메소드/ 반복문 (0) | 2022.10.26 |
[JavaScript] 함수 (0) | 2022.10.25 |
[JavaScript] 배열 (0) | 2022.10.25 |