“什么是”呢;“继承”;用Javascript?

“什么是”呢;“继承”;用Javascript?,javascript,inheritance,Javascript,Inheritance,有人能用简单的话向我解释一下JavaScript中“继承”的含义吗?您可以从另一个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

有人能用简单的话向我解释一下JavaScript中“继承”的含义吗?

您可以从另一个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的johnresig对此有很好的指导 关于继承


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

JavaScript中继承的含义与任何面向对象语言中继承的含义没有区别

继承的子女继承其父母的行为(说明可能性和功能)。当然,这些孩子可以增加额外的行为或超越现有的行为。在这方面,JavaScript中的继承与其他任何继承都没有区别

这就是尽可能用简单的词语表达的意思。然而,您并没有问继承是如何在JavaScript中实现的,因为这将是一个完全不同的故事(和问题)。在这种情况下,我们应该解释类和原型(在JavaScript中使用)之间的差异。

Robert说得对,“继承”在JS中并不意味着什么不同,但它的实现与许多其他语言不同。说一个对象或类从另一个继承意味着成员(属性、行为)可以在父对象上定义,但可以通过子对象访问。在您询问“成员”是什么意思之前,对象是(aka),成员是组件

JS最初是用设计的,其中父对象是对象,但基于类的继承(某种程度上)可以通过各种方式嵌入。类(以及类继承)可以添加到更高的标准中,这是定义JS的标准,以及其他语言,如ActionScript。ActionScript已经支持类


与“继承”密切相关的是“扩展”,即子级通过添加或重写成员来扩展父级。

简单地说,继承是一件事物获得另一事物的属性或行为的概念。说A从B继承,就是说A是一种B。鸟从动物继承,因为鸟是一种动物-它可以做同样的事情,但更多(或不同)

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

function Animal() {}; // This is the Animal *Type*
Animal.prototype.eat = function () {
    alert("All animals can eat!");
};
现在要创建一个继承自动物的类型,您还可以使用
原型
对象,但这次是属于另一个类型的对象,例如鸟:

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()


Robert关于Javascript继承的一个很好的解释

继承在JavaScript中的工作方式是它是
原型
,而不是
基于类的

例如

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继承也有很好的了解:

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

例如:

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

我不同意这一点,因为JavaScript与许多其他面向对象语言(有意地)不同。是的,实现也不同,但是JavaScript使用基于原型的继承,而大多数语言使用经典继承。JavaScript没有类。对象从其他对象继承。当然,您可以模拟类;但你到底为什么要这么做?@Dan我想这个答案需要澄清一下,但目的是正确的。。。继承的概念以及使用它的原因在不同的语言中没有改变。不同之处在于它是如何完成的,而在JS中,这恰好是通过原型实现的。术语“类”虽然对初学者有误导作用,但它是一种在JS中描述构造函数(以及相关原型)的便捷方式。您可以将工作“类”排除在外,而不用谈论孩子和家长。使用误导性的术语违背了回答的目的。AFAIK:他要求用Javascript对继承进行简单解释。在这个特殊的情况下,我认为我的答案是正确的。如果他不熟悉JavaScript中的继承,那么他可能也不熟悉原型/类的差异。在我的答案中加上这些词意味着更多的单词,这将使它变得复杂而不是简单,也更难理解。对于不熟悉JavaScript的人来说,我的答案是最好的。在JS中,从另一个函数分配原型是一种错误的继承方式。在
b.prototype=a.prototype
之后,您不能向
b
的原型添加任何内容而不影响
a
。更新:查看此问题以了解详细信息:是否应该:
b.prototype=new a()?否则,
b
实际上不是继承自
a
,而是它的别名/同义词。如果这是(原型),这就是为什么人们说使用原型是“有争议的”?
function Person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
}
Person.prototype.nationality = "English";