什么是Javascript中的“继承”?

时间:2011-02-17 09:22:06

标签: javascript inheritance

任何人都可以用简单的词语向我解释JavaScript中“继承”的含义吗?

6 个答案:

答案 0 :(得分:54)

简单来说,继承是获得其他东西的属性或行为的一件事的概念。从B说A 继承,就是说A B的一种类型.Bird 从Animal继承,因为Bird 是一种动物 - 它可以做同样的事情,但多一点(或不同)!

在JavaScript中,这种关系有点复杂,但要注意语法。您必须使用名为prototype的特殊对象,该对象将属性分配给类型,例如Animal。只有function具有prototype,这就是您必须首先创建函数的原因:

function Animal() {}; // This is the Animal *Type*
Animal.prototype.eat = function () {
    alert("All animals can eat!");
};

现在要创建一个继承自Animal的类型,您还可以使用prototype对象,但这次属于另一个类型的对象,例如鸟:

function Bird() {}; // Declaring a Bird *Type*
Bird.prototype = new Animal(); // Birds inherit from Animal
Bird.prototype.fly = function() {
    alert("Birds are special, they can fly!");
};

这样做的结果是您创建的任何鸟类(称为鸟类的实例)都具有动物的属性,但它们还具有额外的.fly()

var aBird = new Bird(); // Create an instance of the Bird Type
aBird.eat(); // It should alert, so the inheritance worked
aBird.fly(); // Important part of inheritance, Bird is also different to Animal

var anAnimal = new Animal(); // Let's check an instance of Animal now
anAnimal.eat(); // Alerts, no problem here
anAnimal.fly(); // Error will occur, since only Birds have fly() in its prototype

答案 1 :(得分:12)

Robert在Javascript here

中继承的一个很好的解释

继承在JavaScript中的工作方式是prototype,而不是class-based

例如

function Being () {
    this.living = true;
}
Being.prototype.breathes = function () {
    return true;  

继承存在的对象

Robert.prototype = new Being;
function Robert () {
    this.blogs = true;
}
Robert.prototype.getsBored = function () {
    return "You betcha";
};  

所以,基本上,如果我们创建一个Robert对象的新实例并调用它的一些方法,结果将是:

// Create an instance of the Robert object
var me = new Robert();

/*
    Returns "You betcha" as it's a method
    belonging to the Robert object
*/
me.getsBored();

/*
    Returns true. Since the Robert object
    doesn't have a breathes method of
    its own, it goes back in the
    prototype chain to its parent
    object, Being, and finds the
    method there
*/
me.breathes();  

同样很好地阅读了JavaScript继承:JavaScript Inheritance

答案 2 :(得分:1)

罗伯特说得对,“继承”并不代表JS中的任何不同,但它的实现方式与许多其他语言不同。要说一个对象或类继承自另一个意味着可以在父级上定义成员(属性,行为),但可以通过子级访问。在您询问“成员”的含义之前,对象是aggregate types(又名composite types),成员是组件。

JS最初是用prototype based inheritance设计的,其中父项是对象,但是基于类的继承(某种类型)可以通过各种方式进行操作。类(以及类继承)可以添加到后来的ECMAScript标准中,这是定义JS的标准,以及ActionScript等其他语言。 ActionScript已经支持类。

与“继承”密切相关的是“扩展”,其中子女通过添加或覆盖成员来扩展父级。

答案 3 :(得分:0)

这很简单,您可以从其他javascript对象继承属性,如下所示:

var a = function () {}
a.prototype.sayHello = function () { alert('hello') }

var b = function () {}
b.prototype = new a();

var c = new b();
c.sayHello(); // Alerts "hello"

jQuery的John Resig有一个关于它的优秀指南http://ejohn.org/apps/learn/ 关于继承http://ejohn.org/apps/learn/#76

编辑根据Roberts评论更新了代码。

答案 4 :(得分:0)

JavaScript中继承的含义与任何面向对象语言没有什么不同。

继承的子进程继承父进程的行为(状态可能性和功能)。这些孩子当然可以添加其他行为或覆盖现有行为。在这方面,JavaScript中的继承绝对没有任何其他区别。

这就是尽可能简单的含义。但是你没有问过如何在JavaScript中实现继承,因为这是一个完全不同的故事(和问题)。在这种情况下,我们应该解释类和原型(在JavaScript中使用)之间的差异。

答案 5 :(得分:0)

简单,继承意味着:“对象/类继承自其他对象/类”通过原型

例如:

function Person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
}
Person.prototype.nationality = "English";