2

有一种最流行的 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 对象是无用的。请说明情况。谢谢。

4

3 回答 3

5
 Child.prototype = Parent.prototype; 

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

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

于 2013-10-02T18:54:32.840 回答
2

要意识到的最重要的事情是 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,您可能想尝试而不是自己动手。

于 2013-10-02T19:01:02.147 回答
0

我相信 javascriptprototype是对象的实际实例,如果您执行以下操作:

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

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

于 2013-10-02T18:53:42.180 回答