// window객체는 global객체이다, 전역 변수들은 window 객체의 속성(Property)이 된다.
var a = 1;
var b = 10;
c = 100;
window.d = 1000;
// hasOwnProperty 해당 객체에서 맴버가 존재하는지 확인 (객체에 property라는 속성이 있는지 여부를 확인)
console.log(window.hasOwnProperty("a")); // true
console.log(window.hasOwnProperty("b")); // true
console.log(window.hasOwnProperty("c")); // true
console.log(window.hasOwnProperty("d")); // true
// in연산자 상속계통을 뒤져서 맴버가 존재하는지 확인 (프로토타입 체인)
console.log("hasOwnProperty" in window); //true
console.log("constructor" in window); //true
console.log("toString" in window); //true
console.log("prototype" in window); //false
// for in Loop 상속계통을 뒤져서 모든 맴버출력 (프로토타입 체인)
var obj = {
a : 10,
b : 20,
c : 30
}
for(var i in obj) {
console.log(i); // a b c 출력
}
//-------------------------------------------------------------------------------------------------------------------------------
Object.prototype.xxx = function() { // 모든 객체 메서드 정의
console.log("xxx메서드");
}
var _obj = {'name': '김익룡', 'city' : '서울'};
for(var el in _obj) {
//console.log(el); // 확장시킨 xxx까지 출력이되네.. // 상속계통을 뒤져서 모든 맴버출력 (프로토타입 체인)
if(o.hasOwnProperty(el)) { // 해당 객체의 맴버존여 확인
console.log(el);
}
}
//-------------------------------------------------------------------------------------------------------------------------------
// 함수에 속하지 않고 var키워드를 통해 전역 유효범위에 작성된 것이 "전역 변수"이다.
// 결국 delete 연산자가 삭제할 수 있는 건, var 없는 암묵적으로 생성된 전역 객체의 프로퍼티...
// var를 쓰지 않는 습관은 고치는게 좋다. strict 모드에선 var를 쓰지 않는 걸 잡아냄
/*
var를 쓰지 않았을 경우 일어나는 일 :
function 안에서 var를 쓰지 않고 변수를 쓰면 흔히 'global 변수로 선언된다' 라고 하지만 틀린말이다.
num = 0; 그냥 쓰게 되면 바로 글로벌 변수가 되기 때문에 이렇게 생각하기 쉬운데,
바로 글로벌 영역으로 가는 것이 아니라 '현재보다 위의 scope에 sum이라는 변수가 있는지 체크'하는 것이다.
이러한 체크를 글로벌 영역까지 지속적으로 하게 되다가 만약 글로벌에서도 변수가 정의되지 않았으면 글로벌 영역에다가 변수를 하나 선언하게 된다.
var를 생략해도 에러는 없지만, "전역 변수"가 되는게 아니라 실행(runtime)시 window의 "프로퍼티"가 됨을 확실히 알아야한다.
*/
// 명시적으로 var을 붙인 변수(Property), 함수선언문은 delete 할수 없다.
console.log(delete a); //false
console.log(delete b); //false
console.log(delete c); //true
function Obj(){
}
var o = new Obj();
console.log(o); // Obj
console.log(typeof o); // Object
console.log("constructor" in o); // true
console.log(o.constructor == Obj); // true

console.log(o instanceof Obj); // true //instanceof 해당 객체가 특정 클래스의 인스턴스인지 확인
console.log(o instanceof Object); // true // 조상타입의 instanceof 연산에도 true를 결과로 얻으며, (JAVA에서) 결과가 ture라는 것은 검사한 타입으로의 형변환이 가능하다는 뜻
//객체 리터럴은 key : value
var foo = {
a:1,
b:2,
c:3,
d:function(){
console.log('hello');
}
};
console.log(foo.a);
console.log(foo.b);
// 객체의 프로퍼티를 삭제하려면 delete 를 사용해야만 한다.
// delete연산자는 객체의 속성(Property)을 삭제한다. (key를 삭제한다.)
// 프로퍼티에 undefined나 null을 할당하는 것은 프로퍼티 삭제가 아니라 프로퍼티에 할당된 value만 지우고 key는 그대로 두는 것이다.
/*
객체 리터럴 에서 var를 쓸수 없는것 처럼, 윈도우 객체에서 var를 명시하면 프로퍼티가 삭제가 안되는 것인가?????? **걍 혼자생각...
객체생성도 runtime 생성되니까!!
*/
console.log(delete b);
console.log(foo.c);
foo.d();


반응형
Posted by 힘없는염소