JavaScript 通过prototype改变原型的两种方式
// -------------------- prototype 1 --------------------
function A(){}
A.prototype.n = 1
let b = new A()
A.prototype.n = 2
A.prototype.m = 3
let c = new A()
console.dir(b) // {n: 2, m: 3}
console.dir(c) // {n: 2, m: 3}
// -------------------- prototype 2 --------------------
function A(){}
A.prototype.n = 1
let b = new A() // 实例的 _proto__ 与构造函数的 prototype 指向同一个地址.
A.prototype = {n:2,m:3} // 这里把构造函数的 prototype 指向了别的地址,所以实例的 __proto__ 和构造函数的 prototype 不再指向同一个地址了
let c = new A()
console.dir(b) // {n: 1} 而前者的A.prototype改变了地址,指向了{n:1, m:2},所以不会影响先前创建的实例b
console.dir(c) // {n: 2, m: 3}
/**
* A.prototype.n是添加属性n的值,A.prototype={n:1,m:2}是用{n:1,m:2}对象覆盖了prototype其他的属性
* 使用.的形式还是操作原先的内存指向, 而等号就是重新赋值了
*/
Keep learning