저는 경험이 많은 객체 지향 프로그래머입니다.하지만이게 나를 잡았습니다! 왜 새 f()는 할 수 있지만 새 a()는 할 수 없습니까? 나는 어떤 조언을 주셔서 감사하겠습니다.javascript 수수께끼 : 생성자, 프로토 타입 및 __proto__ 링크와 동일한 것으로 보이는 2 개의 객체
// first a few facts
if (Object instanceof Function) console.log("Object isa Function");
console.log("Function.prototype is " + Function.prototype);
/* output
Object isa Function
Function.prototype is function Empty() {}
*/
var f = new Function();
console.log("Prototype of f:" + f.prototype);
console.log("Constructor of f:" + f.constructor);
console.log("Prototype Link of f:" + f.__proto__);
if (f instanceof Function) console.log("f isa Function");
/* output
Prototype of f:[object Object]
Constructor of f:function Function() { [native code] }
Prototype Link of f:function Empty() {}
f isa Function
*/
function A() {}
console.log("Prototype of A:" + A.prototype);
console.log("Constructor of A:" + A.constructor);
console.log("Prototype Link of A:" + A.__proto__);
if (A instanceof Function) console.log("A isa Function");
/*
Prototype of A:[object Object]
Constructor of A:function Function() { [native code] }
Prototype Link of A:function Empty() {}
A isa Function
*/
// contruct a
var a = new A();
console.log("Prototype of a:" + a.prototype);
console.log("Constructor of a:" + a.constructor);
console.log("Prototype Link of a:" + a.__proto__);
if (a instanceof Function) console.log("a isa Function");
if (a instanceof A) console.log("a isa A");
/* output
Prototype of a:undefined
Constructor of a:function A(){}
Prototype Link of a:[object Object]
a isa A
*/
console.log("~~~~~b constructed as new f()");
var b = new f();
console.log("Prototype of b:" + b.prototype);
console.log("Constructor of b:" + b.constructor);
console.log("Prototype Link of b:" + b.__proto__);
/* output
~~~~~b constructed as new f()
Prototype of b:undefined
Constructor of b:function anonymous() {}
Prototype Link of b:[object Object]
*/
console.log("~~~~~b constructed as new a()");
a.prototype = Object.prototype;
a.constructor = Function;
a.__proto__ = Function.prototype;
if (a instanceof Function) console.log("a isa Function");
console.log("Prototype of a:" + a.prototype);
console.log("Constructor of a:" + a.constructor);
console.log("Prototype Link of a:" + a.__proto__);
/* output
~~~~~b constructed as new a()
a isa Function
Prototype of a:[object Object]
Constructor of a:function Function() { [native code] }
Prototype Link of a:function Empty() {}
*/
b = new a();
/* ERROR Uncaught TypeError: object is not a function*/
저는 출력을 제공하기 위해 최선을 다했습니다. f와 a는 프로토 타입, 생성자 및 프로토 타입 링크의 관점에서 동일하다는 것을 알아 두십시오. 마지막 행에서 a()를 새로 만들려고 할 때 ERROR가 나타나는 이유는 무엇입니까?
"new"는 함수를 필요로합니다. _a_는 _A_ 생성자의 개체 인스턴스입니다. – dandavis
인스턴스화 된 개체의 "prototype"속성이있을 것으로 예상되지만 올바르지 않습니다. * edit * yes 그리고 @dandavis에 의하면, 객체는 함수가 아니며 생성자로 사용할 수 없습니다. – Pointy
생성자는 객체이며 함수입니다. 생성자로 호출되면 함수가 아닌 일반 객체를 반환합니다 (기본값). Plain 객체는 private ['[Prototype]]을 가지고 있지만 public * prototype * (디폴트로)을 가지고 있지 않습니다. – RobG