b.prototype=a.prototype 为什么不能直接这样赋值,而需要使用另外一个函数转一下

javascript xue8 1年前 81次浏览



function Person(){

}
Person.prototype.run = function(){
console.log(\'run\')
}
function Animale(){

}
Animale.prototype = Person.prototype //为什么不推荐这样直接改变某个函数的原型

Animale.prototype.eat = function(){
console.log(\'eat\')
}

console.log(new Animale().run())

Animale.prototype = Person.prototype 这一句正确的写法应该是


var tempFunc = function(){}
tempFunc.prototype = Person.prototype
Animale.prototype = new tempFunc()

为什么需要这个tempFunc,直接Animale.prototype = Person.prototype这样赋值为什么是有问题的?





回答:


示例


// 人可以走路
function Person(){}
Person.prototype.run= () => console.log(\'走路\')

// 动物可以冬眠
function Animale(){}
Animale.prototype.dongmian = () => console.log(\'冬眠\')
}

// 动物也可以走路,直接赋值
Animale.prototype = Person.prototype
new Animale().run() // => 走路

// 人可以过年
Person.prototype.guonian = () => console.log(\'过年拿押岁钱\')
new Animale().guonian() // => 过年拿押岁钱

问题来了...动物也可以过年..就不是出问题了么?


原理




  • prototype是个对象

  • 对象是引用类型

  • 直接赋值后,相当于他们共用了同一个对象

  • 而通过后面那种方式,是新创建了一个对象,以后不管person的原型怎么变,都不会影响到animle



0条回复
撰写答案