소프트웨어/JavaScript • Dhtml
new Object() 와 {} 의 차이에 대한 댓글정리문서
falconer
2007. 4. 12. 13:26
재미있는 내용이라 phpschool에서 가져왔습니다. 먼저 전 선생님이 아닙니다. 누굴 가르쳐본적도 없고, 가르치면서 일을 진행한적도 없습니다. 하지만, 고니님이 주장하는것과 제가 생각하는것이 달라, 단지, 처음부터 끝까지 거짓이 진실이 되는걸 볼수 없기 때문에 150개가 넘는 댓글을 달게 된것입니다. 어쨋든 고니님의 뜻도 ----------------------------- 아뇨. 정말로 틀렸다는 것을 증명해주시기를 바라고 있습니다. 원하신다면 문서로 만들어서 대중의 심판을 받을 각오도 되어있습니다. ----------------------------- 와 같아 최대한 주관을 배제하려고 글을 올립니다. 주관이 섞인 부분은 지적해 주시면, 지우도록 하겠습니다. 만약 주관이 섞여 있다면, 위의 글들을 보시고, 해당하는 주관을 배제하시기 발바니다. 원본의 댓글들은 다음과 같습니다. http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=52892&page=1 아래의 논쟁으로 부터 시작된거이며, 명제는 다음과 같습니다. 1. Core Object 인 Object 의 정의는 다음과 같다. (http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Object) Object is the primitive JavaScript object type. All JavaScript objects are descended from Object. That is, all JavaScript objects have the methods defined for Object. (주관배제하기 위해 해석하지 않습니다.) 2. new Object() 와 {} 는 Object 의 instance 를 만든다. 3. predefined Core Objects Array Object Boolean Object Date Object Function Object Math Object Number Object RegExp Object String Object 4. __proto__ 와 prototype 은 다르다. prototype is for types, while __proto__ is the same for instances (http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Inheritance) (http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Property_Inheritance_Revisited:Determining_Instance_Relationships) 5. constructor 의 정의는 Specifies the function that creates an object's prototype. 6. prototype 의 정의는 prototype: Allows the addition of properties to all objects. 논쟁거리는 1. new Object() === {} 가 같다? 2. Object 가 {} 으로 만들어진다? 3. constructor 의 비교로 객체가 똑같다고 말할수 있다? 4. Object 는 Function 의 instance 이다? 입니다. 여기부터는 대화의 내용을 정리한것이라, 최대한 주관을 배제하려고 노력했습니다. 1. 고니님은 new Object() === {} 같다. 다르다는 것을 증명을 해보라 -> {} 는 setter 와 getter 를 prefix 할때 사용한다. 허나 new Object() 는 added later to any object at any time using 이다. -> {} 문법이 말 그대로 Object initializer 라서지, 그게 new Object 와 {}가 다르다는 근거는 되지 못한다는 것 -> ie에서 delete Object; alert({}); // instance return alert(new Object()); // error FF 에서는 core Object가 삭제되지 않아 위의 코드가 정상적으로 진행된다. -> 행복한 고니님의 주장.. Jscript 이기 때문에, IE 에서만 동작하기 때문에 인정할수 없다. -> 아래의 4번의 내용은 Firefox에서만 동작한다. 따라서 특정브라우저에서만 동작된다고, 본질은 무시하지 못한다. -> 고니님 rhino 소스를 보여준다. 이래도 같지가 않은지를... -> --------------------------------------------------------------------------- public static Scriptable newObjectLiteral(Object[] propertyIds, Object[] propertyValues, Context cx, Scriptable scope) { Scriptable object = cx.newObject(scope); for (int i = 0, end = propertyIds.length; i != end; ++i) { Object id = propertyIds[i]; Object value = propertyValues[i]; if (id instanceof String) { ScriptableObject.putProperty(object, (String)id, value); } else { int index = ((Integer)id).intValue(); ScriptableObject.putProperty(object, index, value); } } return object; } public final Scriptable newObject(Scriptable scope, String constructorName, Object[] args) { scope = ScriptableObject.getTopLevelScope(scope); Function ctor = ScriptRuntime.getExistingCtor(this, scope, constructorName); if (args == null) { args = ScriptRuntime.emptyArgs; } Object a = ctor.construct(this , scope, args); return ctor.construct(this, scope, args); } --------------------------------------------------------------------------- 소스와 4단계 . object = new Object(); function a() { var object = new Object(); var tmp; for(var i = 0; i < arguments[i] ; ++i){ tmp = arguments[i].split(':'); object[tmp[0]] = tmp[1]; } return object; }; var xx = a(); alert(xx.__proto__.__proto__); // null alert(object.__proto__.__proto__); // null alert(object.__proto__ === xx.__proto__); // Object 는 같다. alert(object === xx); // false 소스를 보여주며, 4단계에 걸쳐 퀴즈로 증명. 2. Object 가 {} 으로 만들어진다? -> ECMA 문서에 있다고 고니님 주장. -> Object 와 instance 간의 차이를 모르는것 같아 Object 가 {} 으로 만들어진다는 내용을 찾을수 없다. 자세한 페이자와 줄번호를 알려달라함. -> Object 는 new Object() 를 의미하는것이다. 말꼬리 잡는것으로 고니님 주장. (Object 클래스 자체로 이해하고 있었군요. Object 가 생성된다는 의미를 저는 Object 객체가 생성된다라고 사용해왔고 코드를 통해 설명할 때는 분명 new Object 를 사용했었으며, 처음부터 지금까지 계속 같은 말만 하고 있습니다.비록 표현에 오해가 있을 수 있다해도 말이죠.) -> Java 로 쓴글을 문맥만 보고 Javascript 로 이해해야 되는지에 대한 반문 3. constructor 로 객체를 비교할수 있다? -> 행복한 고니님의 주장은 var obj1 = new Object; var obj2 = {}; alert(obj1.constructor === obj2.constructor); 의 결과는 true입니다. 두 객체의 생성자는 완전히 똑같은 객체이며 alert(obj1.constructor === Object); 에서 보다시피 그것은 Object 이다. -> alert(Array.constructor); alert(Object.constructor); alert(Function.constructor); alert(Number.constructor); alert(Array.constructor === Object.constructor); alert(Array.constructor === Object.constructor); alert(Array.constructor === Function.constructor); alert(Array.constructor === Number.constructor); alert(Function.prototype.constructor.constructor); alert(Array.prototype.constructor.constructor === Function.prototype.constructor.constructor); alert(Array.prototype.constructor.constructor === Number.prototype.constructor.constructor); alert(Array.prototype.constructor.constructor === Object.prototype.constructor.constructor); alert(Object.prototype.constructor.constructor === Object.prototype.constructor.constructor); alert(Array.prototype.constructor.constructor === Array.prototype.constructor.constructor); Array === Object === Function === Number 모두가 같다.? 말이 되지 않는다. -> Array === Object는 아니죠. identity도 다르고 값도 다르니까요. 하지만 "자료구조"임에는 확실 그게 Array와 Object의 "본질" 이라 표기 (new Object).constructor 를 하게되면 new Object 자체의 성질을 묻는 것이고, (new Object).constructor.constructor 를 하게되면 (new Object 타입객체라는 인스턴스)의 성질을 묻는 겁니다. 성질은 -> 본질을 의미한다 주장. -> 그럼 instance 간의 비교 new Object().constructor.constructor == new Array().constructor.constructor 가 성립되는 이유가 말이 안된다. 따라서 constructor 로 Object 를 비교하는것은 어불성설이다. 이유는 Object가 최상위이기 때문이다. Object | Array - Number - String - Function ... 으로 되어 있고 각각의 Function 이라는 chain 으로 감싸서 서로 연결되도록 구성되어 있는것입니다. 그래서 constructor 로 객체를 비교하는것은 무리가 있다라는 것입니다. constructor 를 2번 비교하는것이랑 1번비교하는것이랑의 차이는 없다. alert(delete Function.prototype.constructor); // prototype chain 해제 alert(new Function().constructor.constructor); // object return alert(new Object().constructor.constructor); // object return alert(new Array().constructor.constructor); // object return alert(new Number().constructor.constructor); // object return alert(new String().constructor.constructor); // object return alert(String.constructor); // object return alert(Function.constructor); // object return alert(Object.constructor); // object return alert(Array.constructor); // object return alert(Number.constructor); // object return 4. 고니님 Object 는 Function 의 instance 이다. 주장 alert(Object.__proto__ === Function.prototype); alert(Object.__proto__ === Object.prototype); alert(Array.__proto__ === Function.prototype); alert(Array.__proto__ === Object.prototype); -> __proto__ 와 prototype 이 같다고 생각하시는지 질문. alert(new Object().__proto__ === new Object().prototype); 왜 위의 코드는 왜 다른지. -> instanceof 로 고니님 반증 delete Function.prototype.constructor; alert(Object instanceof Function); alert(Object.__proto__ === Function.prototype); alert(Object.__proto__ === Object.prototype); alert(Array.__proto__ === Function.prototype); alert(Array.__proto__ === Object.prototype); -> 명제에서 __proto__ 와 prototype 은 다르다는걸 모르고 계속적으로 비교 alert(Object.prototype.__proto__); // null -> function 의 상속이 아니다. 라는 증명 alert(Function.prototype.__proto__.__proto__); //null alert(Array.prototype.__proto__.__proto__); // null alert(String.prototype.__proto__.__proto__); // null alert(Object.prototype); // object alert(Function.prototype.__proto__); // object alert(Array.prototype.__proto__); // object alert(String.prototype.__proto__); // object 따라서, Object 가 최상위객체이며, function(){} 으로 prototype chain 만 구성한다. 즉, Object 는 Function 의 instance 가 아니다. 고로, 고니님이 주장하는 내용은 주관,고집 이다. 라고 주장 여기까지이며, 원문의 댓글과 정리된 내용이 뜻이 다름이 있으면 관련된 내용에 대해 배제하시기 바랍니다. 감사합니다. | ||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'소프트웨어 > JavaScript • Dhtml' 카테고리의 다른 글
테이블 틀고정 스크롤 (0) | 2007.04.13 |
---|---|
IE/FF(Gecko,W3C) 이벤트 설명 (0) | 2007.04.13 |
js_layer_move.js : 레이어 이동 스크립트 , 업그레이드 (0) | 2007.04.12 |
Javascript의 새 흐름. Tamarin 프로젝트에 대해서 (0) | 2007.04.12 |
select 박스 자동 선택 (0) | 2007.04.12 |
'소프트웨어/JavaScript • Dhtml'의 다른글
- 현재글new Object() 와 {} 의 차이에 대한 댓글정리문서