原型链相关问题,求大佬不吝赐教?

var A = function() {};
A.prototype.n = 1;
var a=new A()
A.prototype = {
  n: 2,
  m: 3
}
console.log(a.n);//1
console.log(a.m);//undefined

var A = function() {};
A.prototype.n = 1;

A.prototype = {
  n: 2,
  m: 3
}
var a=new A()
console.log(a.n);//2
console.log(a.m);//3

请问,为什么var a=new A()的位置会影响结果

阅读 1.6k
3 个回答
var A = function() {};
A.prototype.n = 1;
var a=new A()
var p0 = A.prototype
console.log("a.__proto__ is p0", Object.is(Object.getPrototypeOf(a), p0))
A.prototype = {
  n: 2,
  m: 3
}
var p1 = A.prototype
console.log("p0 is p1", Object.is(p0, p1))
console.log("a.__proto__ is p0", Object.is(Object.getPrototypeOf(a), p0))
console.log("a.__proto__ is p1", Object.is(Object.getPrototypeOf(a), p1))
console.log("p0 is", p0)
console.log("p1 is", p1)
console.log(a.n);
a.__proto__ is p0 true
p0 is p1 false
a.__proto__ is p0 true
a.__proto__ is p1 false
p0 is { n: 1 }
p1 is { n: 2, m: 3 }
1

var A = function() {};
A.prototype.n = 1;
var p0 = A.prototype
A.prototype = {
  n: 2,
  m: 3
}
var p1 = A.prototype
var a=new A()
console.log("p0 is p1", Object.is(p0, p1))
console.log("a.__proto__ is p0", Object.is(Object.getPrototypeOf(a), p0))
console.log("a.__proto__ is p1", Object.is(Object.getPrototypeOf(a), p1))
console.log("p0 is", p0)
console.log("p1 is", p1)
console.log(a.n);
p0 is p1 false
a.__proto__ is p0 false
a.__proto__ is p1 true
p0 is { n: 1 }
p1 is { n: 2, m: 3 }
2
var A = function() {};
A.prototype.n = 1;

// 此时 A.prototype = {constructor: A, n: 1}

var a=new A()

// 此时 a.__proto__ = A.prototype = {constructor: A, n: 1}

A.prototype = {
n: 2,
m: 3
}

// 此时 A.prototype = {contructor: Object, n: 2, m: 3},已经不是前面的原型对象了

这个时候再改 A 的 prototype 已经对 a 的 proto 没影响了, A 的 prototype 指向了新对象 {contructor: Object, n: 2, m: 3}, a 的 proto 指向的是 A 原来的 prototype 指向的对象 {constructor: A, n: 1},所以 a.n 为 1。

var a=new A() 放在 A 改 prototype 之后时,a.__proto__ 指向的是改后的原型对象,所以 a.n 是 2。

因为是在new的时候确定继承关系的,new的时候构造函数的prototype指向什么,那就继承自谁

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题