原型链如何在Javascript中工作



我正在尝试为Thief类建立一个原型链,以继承Assassin类的方法,其工作原理如下:

function Assassin() {
this.sonicBlow = function() {return "Performs Sonic Blow!"};
this.enchantDeadlyPoison = function() {return "Performs Enchant Deadly Poison!"}
}
Assassin.prototype.venomDust = function () {return "Performs Venom Dust!"}
function Thief() {
this.hide = function() {return "Performs Hide!"}
}
Thief.prototype = new Assassin()
let thief = new Thief()
let sin1 = new Assassin()
console.log(thief.sonicBlow())
console.log(thief.enchantDeadlyPoison())
console.log(thief.venomDust())

但是当我试图让Assassin类继承Thief类方法时,如果我这样做,它就不起作用:

Assassin.prototype = new Thief()
console.log(sin1.hide())

它说:sin1.hide不是一个函数

有人能告诉我为什么吗?

您需要更加清楚自己想要做什么。请记住,原型链接应该是一个没有循环的链。你需要决定刺客是否应该继承盗贼的遗产,反之亦然。例如,如果你想让Thief和Assassin都有一个通用的隐藏方法,你可能想创建第三个类BadGuy,并让Assassin和Thief都继承它。

最后,ECMAScript 6(即Javascript 6(对类和继承有更好的支持。你可能想看看这个:http://es6-features.org/#ClassInheritance

对象和函数原型之间的引用是在对象实例化时建立的

所以当你看到这行代码时:

let sin1 = new Assassin()

sin1实例[[prototype]]对象只有venomDust()。但当你看到这行代码时:

Assassin.prototype = new Thief()

你正在改变刺客的原型。因此,只有这行代码之后的新实例才能访问Thief.prototype对象。

由于sin1是用Assassin((的旧原型创建的,因此sin1将只能访问Assassin的旧原型。即使您更改了原型,因为sin1正在引用,所以旧原型仍然有效。如果没有引用旧原型的Assassin((实例,它将被垃圾收集。

最新更新