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其他的属性
 * 使用.的形式还是操作原先的内存指向, 而等号就是重新赋值了
 */

posted @ 2020-08-04 10:57  荣光无限  阅读(537)  评论(0编辑  收藏  举报