通过原型进行 JavaScript 继承

JavaScript inheritance through prototype

本文关键字:JavaScript 继承 原型      更新时间:2023-09-26

有最流行的JavaScript继承方法:

function extend(Child, Parent) {
    var F = function() { }
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.superclass = Parent.prototype;
}

我现在正在学习JS,但我有很多Java经验,这种继承模型对我来说似乎有些困难。为什么我不能做以下事情:

function extend(Child, Parent) {
    Child.prototype = Parent.prototype; 
    Child.prototype.constructor = Child;
}

我想我不知道/不明白有些事情,但在我看来 F 对象是无用的。请澄清情况。谢谢。

 Child.prototype = Parent.prototype; 

现在Child.prototypeParent.prototype同一个对象

将方法添加到Child.prototype会将它们添加到Parent.prototype这不是经典的OOP继承的工作方式。

要认识到的最重要的事情是,JavaScript 本身没有内置经典继承。 它不像Java,所以如果你想使用JavaScript的原型,你会想把所有的Java继承想法都扔到窗外。

原型的想法是将单个对象连接到构造函数。这是您的原型对象。使用构造函数生成新对象,这些对象都可以访问构造函数原型中包含的方法。诀窍在于,如果您修改附加到构造函数的原型,您更改的方法现在将更改为构造函数创建的所有子对象。 它的工作原理是这样的:

function Cat(name) {
    this.name = name;
}
Cat.prototype = {
  furColor: function () {
    return 'gray';
  }
};
var kitty1 = new Cat('Bob');
//=> {name: 'Bob'}
kitty1.furColor();
//=> 'gray'
Cat.prototype.furColor = function () {
  return 'white';
}
var kitty2 = new Cat('Sally');
//=> {name: 'Sally'}
kitty2.furColor();
//=> 'white'
kitty1.furColor();
//=> 'white'

因此,如果你想从这个模型构建经典继承,你可以,但请记住,这就是你在 JavaScript 中得到的原型。

有一个非常流行的经典继承插件,它给你一些不错的OO JavaScript,叫做klass,你可能想尝试而不是自己滚动。

我相信javascript prototype是一个对象的实际实例,如果你做这样的事情:

Child.prototype = Parent.prototype; 
Child.prototype.constructor = Child;

您还将更改Parent的原型,因为它们是对象的相同实例。