JavaScript继承通过原型

时间:2013-10-02 18:51:04

标签: javascript

有最流行的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对象毫无用处。请澄清一下情况。谢谢。

3 个答案:

答案 0 :(得分:5)

 Child.prototype = Parent.prototype; 

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

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

答案 1 :(得分: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中的原型获得的。

有一个非常流行的经典继承插件,它为您提供了一些名为klass的优秀OO JavaScript,您可能希望尝试而不是自己动手。

答案 2 :(得分:0)

我认为javascript prototype是对象的实际实例,如果您执行以下操作:

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

你也将改变Parent的原型,因为它们是对象的同一个实例。

相关问题