请问以下JS代码的输出是什么?
let A = function() {} A.prototype.a = 1; let B = new A(); A.prototype = { b: 2, c: 3 } let C = new A(); A.prototype.d = 4; console.log(B.a); console.log(B.b); console.log(C.c); console.log(C.d);
let A = function() {} A.prototype.a = 1; let B = new A(); A.prototype = { b: 2, c: 3 } let C = new A(); A.prototype.d = 4; console.log(B.a); console.log(B.b); console.log(C.c); console.log(C.d);
1、2、3、4
1、undefined、3、4
1、undefined、undefined、undefined
undefined、2、3、4
let A = function() {} A.prototype.a = 1; //此时 A.prototype = { a: 1 } let B = new A(); //此时 B = {} //在创建B时,已将B._proto_ = A.prototype = { a: 1 } //即使后面A.prototype重新赋值,将A.prototype开辟了新的空间指向别的对象 //B._proto_并没有改,还是指向{a:1}这个对象 A.prototype = { //此时 A.prototype = { b: 2, c: 3 } b: 2, c: 3 } let C = new A(); //C = {} A.prototype.d = 4;//此时A.prototype = { b: 2, c: 3, d: 4 } console.log(B.a); //1 console.log(B.b); //undefined console.log(C.c); //3 console.log(C.d); //4 //C.d //着重区分: A.prototype.d = 4 和 A.prototype 重新赋值 不是一个概念 //A.prototype重新赋值时,A.prototype已经指向另一个对象了 //A.prototype.d = 4时,访问的还是同一个A.prototype 对象
如果 let B = new A(); 之后加一个 A.prototype.b = 999;那么 console.log(B.b); B.b就是999
let A =function() {}
栈指针 | 堆内存 |
A.prototype | { } |
A.prototype.a = 1;
栈指针 | 堆内存 | |
A.prototype | { a: 1 } | |
let B =new A();
栈指针 | 堆内存 |
A.prototype B.__proto__ | { a: 1 } |
A.prototype = { b: 2, c: 3 }
栈指针 | 堆内存 |
A.prototype B.__proto__ | { a: 1 } { b: 2, c: 3 } |
let C =new A();
栈指针 | 堆内存 |
A.prototype B.__proto__ C.__proto__ | { a: 1 } { b: 2, c: 3 } |
A.prototype.d = 4;
栈指针 | 堆内存 |
A.prototype B.__proto__ C.__proto__ | { constructor: A, a: 1 } { b: 2, c: 3, d: 4 } |