언어/javascript

javascript : Object 객체 내장함수

하이후에호 2020. 12. 15. 20:43
반응형

Objejct 객체에 있는 메서드를 정리하면 다음과 같습니다.

메서드 이름 설명
constructor() 객체의 생성자 함수를 나타냅니다.
hasOwnProperty(name) 객체가 name 속성이 있는지 확인합니다.
isPrototypeof(object) 객체가 object의 프로토타입인지 검사합니다
propertyIsEnumerable(name) 반복문으로 열거할 수 있는지 확인합니다.
toLocaleString() 객체를 호스트 환경에 맞는 언어의 문자열로 바꿉니다.
toString() 객체를 문자열로 바꿉니다.
valueOf() 객체의 값을 나타냅니다.
var obj = { property : 273};

var output ='';

output += "HOP('property') :"+ obj.hasOwnProperty('property') +'\n';
output += "HOP('constructor') :"+obj.hasOwnProperty('constructor')+'\n';
output += "PIE('property') :"+obj.propertyIsEnumerable('property')+'\n';
output += "PIE('constructor') :"+obj.propertyIsEnumerable('constructor')+'\n';
console.log(output);

for(var key in obj){
    console.log(obj[key]);
}
HOP('property') :true
HOP('constructor') :false
PIE('property') :true
PIE('constructor') :false

273

먼저 object에는 property라는 속성은 존재하지만 constructor라는 속성은 존재하지 않는다.

또한 property는 반복문으로는 열거가 가능하지만 constructor는 존재하지않으므로 열거할 수 없다.

 

var object = new Object();

console.log(object);
console.log(object.toString());

var student = {
    name: '윤명월',
    grade: '대학교 1학년',
    toString: function(){
        return this.name + ' : '+ this.grade;
    }
};

console.log(student);
{}
[object Object]
{ name: '윤명월', grade: '대학교 1학년', toString: [Function: toString] }

원래 모든 객체는 toString() 메서드를 갖는데 다시 선언했으므로 재선언한 것입니다. 자바 스크립트는 객체를 문자열로 변환할 때 자동으로 toString() 메서드를 호출한다고 했으므로 그림 8-8 처럼 출력합니다.

 

 

자료형 구분

var numberFromLiteral = 273;
var NumberFromObject = new Number(273);

var output = '';
output += '1. ' + typeof (numberFromLiteral) + '\n';
output += '2. ' + typeof (NumberFromObject);
console.log(output);
1. number
2. object

두 변수 모두 숫자지만 생성자 함수로 만든 숫자는 객체이므로 이러한 결과가 나옵니다.

이러한 특성 때문에 자료형 검사에 문제가 발생합니다.

 

var numberFromLiteral = 273;
var NumberFromObject = new Number(273);


if(typeof (numberFromLiteral) == 'number'){
    console.log('numberFromLiteral을 숫자입니다.');
}

if(typeof(numberFromObject) == 'number'){
    console.log('numberFromObject는 숫자입니다.')
}
numberFromLiteral을 숫자입니다.

두 변수 모두 숫자지만 생성자 함수로 만든 숫자는 객체이므로 경고창을 출력하지 않습니다. 이러한 두 대상을 같은 자료형으로 취급하고 싶을 때는 constructor() 메서드를 사용해야합니다.

 

var numberFromLiteral = 273;
var numberFromObject = new Number(273);


if(numberFromLiteral.constructor == Number){
    console.log('numberFromLiteral을 숫자입니다.');
}

if(numberFromObject.constructor == Number){
    console.log('numberFromObject는 숫자입니다.');
}
numberFromLiteral을 숫자입니다.
numberFromObject는 숫자입니다.

객체의 생성자 함수가 Number 생성자 함수인지 비교하면 쉽게 숫자인지 구분할 수 있습니다. 다른 자료형도 마찬가지입니다.

 

모든 객체에 메서드 추가

 

Object 객체는 모든 자바스크립트 객체의 최상위 객체입니다. 따라서 Objejct 객체의 프로토타입에 속성 또는 메서드를 추가하면 모든 객체에서 활용할 수 있습니다.

 

Object.prototype 객체에 test() 메서드를 추가합니다. 이렇게 메서드를 추가하면 자바스크립트의 모든 객체에 test() 메서드를 사용할 수 있습니다.

 

Object.prototype.test = function(){
    console.log(this);
};

var number = 273;
number.test();
[Number: 273]

 

반응형