JavaScript中的继承与超链接

JavaScript中的继承与超链接,javascript,class,inheritance,ecmascript-6,super,Javascript,Class,Inheritance,Ecmascript 6,Super,我正在学习JavaScript的第3天。我遇到了以下代码: class B { constructor(name) { this.name = name; } printn() { return this.name; } } class A extends B { constructor(name, age) { super(name); this._age = age; }

我正在学习JavaScript的第3天。我遇到了以下代码:

class B {
    constructor(name) {
        this.name = name;
    }

    printn() {
        return this.name;
    }
}

class A extends B {
    constructor(name, age) {
        super(name);
        this._age = age;
    }

    get age() {
        return this._age;
    }

    printName(){
        return super.printn();
    }
}

let c = new A("Testing", "37");
Console.log(c.printn());
有人能解释一下这个代码的作用吗。什么是构造函数和超级关键字?我相信他们是为了继承?我用谷歌搜索了一些图坦卡蒙,但这似乎是最简单的例子,而且解释得很少

我无法让这个代码工作

什么是构造函数和超级关键字。我相信这是为了遗产

对。上面设置了类B,然后有了类A的子类it。构造函数是在创建类的新实例时调用的函数,如let c=new ATesting,37;代码中的行。与其他一些语言不同,在JavaScript中,一个类只能有一个构造函数

super在子类中用于引用超类。在构造函数中,调用super就像调用函数一样,这调用了超类的构造函数,使它有机会初始化new创建的新对象。例如,在A的构造函数中,super调用B的构造函数

您还可以使用super作为属性访问器表达式的源来访问属性,包括超类上的方法。这就是A的printName方法中发生的情况,它使用super.printName调用B的printName方法。这将失败,因为B没有printName方法;B的方法称为printn

如果我没有指出,虽然这看起来很像Java或C中基于类的OOP,但它不是。它是一种语法糖,是使用构造函数建立JavaScript正常原型继承的好糖。它极大地简化了使用构造函数建立原型继承层次结构的过程。如果我没有指出使用构造函数来进行原型继承是不必要的,那么我也会疏忽大意。您可以通过Object.create来进行原型继承,而无需使用构造函数

还有很多东西需要探索。这可能是一个很好的起点

我无法让这个代码工作

Console.log中的C不应大写,因此更改

Console.log(c.printn());

除此之外,如果您使用的是支持类的JavaScript引擎,比如Google Chrome或Mozilla Firefox中的类,那么该代码运行良好,不过请再次注意,a似乎希望B有一个printName方法,但它没有,最后的代码调用printn,而printn只有B有,这很好,这只是意味着A的代码并没有真正涉及到

B类{ 构造器名称{ this.name=名称; } 印刷品{ 返回此.name; } } A类延伸至B类{ 姓名、年龄{ 超名; 这个。_年龄=年龄; } 变老{ 把这个还给我; } 打印名{ 返回super.printName; } } 设c=新试验,37;
console.logc.printn 欢迎使用JavaScript。祝你旅途好运。我将把您的问题从您的具体问题改为更一般的问题,即如何最好地学习JavaScript

首先,确保已组织好环境,从编辑器或IDE开始。无论您选择哪一个,它都应该帮助您格式化、缩进、突出显示、检查,甚至可能运行代码。花时间学习如何根据您的喜好配置它。安装有用的插件。您将在IDE中花费很多时间。要像布置房子一样小心

接下来,确保您了解在哪里可以找到信息。一些人似乎认为这是一种人力文档服务。MDN几乎总是最好的资源。他们还提供教程,这将是一个很好的开始

接下来,非常熟悉Chrome开发工具。从头到尾阅读这些文件。了解如何使用控制台、源面板、断点和变量监视。在一天结束时,您必须调试自己的程序,尽管SO上的一些人似乎认为他们可以依靠社区来完成这项工作

现在来谈谈语言本身。在深入学习类之前,如果您还没有学习过,我会确保您对基本知识非常熟悉:包括对象和数组的数据类型,以及条件和循环之类的基本控制结构。您应该确切地了解对象是什么,属性是什么,如何以文字形式编写对象,如何设置和检索属性,以及数组的等效概念。不断编写小程序来尝试;您可以在devtools控制台中运行它们

确保您对函数有扎实的理解。它们是JS逻辑的基本构建块。它们是参数化的逻辑束,接受定义良好的输入参数并生成定义良好的输出返回值。了解如何定义函数以及如何调用函数。当你处理一个问题时,思考如何打破它几乎总是一个很好的起点 分解为可以作为函数实现的子问题

一旦熟悉了数组和函数,请确保牢牢掌握了以函数为参数的数组方法和函数。这是正确的;在JavaScript中,函数是可以作为参数传递给其他函数的值。这是您第一次温和地介绍函数式编程。学习forEach和相关的数组方法,在这里传递一个函数来告诉它如何处理每个元素

如果您正在做前端工作,则需要非常熟悉DOM。回到devtools,确保您了解如何使用Elements面板检查DOM。学习用于创建元素、设置元素属性、将元素插入DOM以及在DOM中查找元素(如getElementById)的基本DOM API。同样,当你继续前进的时候,不断地编写一些小的示例程序来确认你走在正确的轨道上,并巩固你的知识。在掌握DOM的同时,您还需要开始学习CSS,这是我们管理属性的方式,控制DOM元素的样式、布局和格式,以及CSS类,CSS类是通过简单地将类分配给元素即可应用的属性束。花点时间掌握级联,这是CSS引擎决定将哪个规则应用于哪个元素的过程。再次回到devtools,确保您了解如何使用样式检查器检查DOM中的CSS属性

您会注意到,我们甚至还没有提到JS类,这就是您在这里提出的问题。我有点惊讶,你在学习过程中这么早就开始钻研这个话题。类是一种特殊的程序设计风格的基础,通常被称为面向对象的编程,或经典的面向对象编程,它涉及设计对象,这些对象是数据束和相关的功能。有人认为所有的编程都是或应该是OOP。还有一些人在根本不使用OOP原则的情况下成功地编写了大型系统


面向对象编程的问题在于,现实世界并没有将自己整齐地划分为动物、狗、车辆、汽车以及As和Bs。在你定义了动物和狗之后,你意识到你需要介于两者之间的哺乳动物,在你意识到这一点之前,你最终会得到一个扭曲的类层次结构,很难理解、维护和扩展,你花了一半的时间重新安排。很可能这些机器对于您试图解决的IRL问题都不是必需的。一旦你有了OOP锤子,一切看起来都像钉子。不久,你就会用新的OOP锤子敲打几股软绵绵的意大利面和一团果冻,或者只是在空中挥舞

请看,我无法使用此代码为什么不呢?有什么问题吗?至于问题的一部分,这是一个非常基本的面向对象编程,之前已经解释过很多次了。您是如何学习Javascript的?也许你需要一个更有条理的课程/教程/书。如果你是在编程的第三天,那么是的,OOP可能是有点早处理。如果你问这些零碎的问题,对你或在座的任何人来说都不会有什么效果,这些问题真的应该以结构化的方式介绍给你。我建议你多读一些技术性的东西,但学习JavaScript非常好。你的话刚刚进入我的大脑。令人惊叹的让我来处理这些信息,如果有问题,我会问更多的问题。非常感谢,先生。我相信ES6之前的版本没有类,所以他们使用原型。什么是protype继承,我将如何在其中编写相同的代码?你能解释它以及类如何解决原型的问题吗?@BenAston:类和对象上的方法有一个令人惊讶的特性:它们有一个bulit链接,链接到它们在[[HomeObject]]上创建的对象,并使用它来处理超级-即使你已经将该方法复制到了一个完全不同的对象上。您可以在不使用类的情况下完成类在ES2015中所做的一切,但它的这一部分并不是ES5所拥有的,因此,尽管它在ES2015机制上,但在ES5机制上有一个最小的东西不是纯粹的语法糖。@BenAston:为了清楚起见:这个对象有一个名为foo的方法,它被分配给了一个名为foo:const obj={foo{};。不过,这个对象只是将一个名为foo的函数分配给一个名为foo:const obj={foo:function{};。在后一种情况下,没有[[HomeObject]]设置后,foo将无法使用super,而在第一种情况下,它可以;它可以使用super.toString来执行Object.prototype.toString.callthis,例如。@BenAston:另外,FWIW,通过类语法定义的方法不能用new调用。不是说任何人都应该这样做,但它的行为仍然偏离了旧的X.prototype、 foo=函数{}.Nitpick-我会
将类描述为经典的OOP,而不是简单的OOP。我相信没有类的JavaScript可以被描述为OOP,尽管我不确定它是否符合Kay的定义,包括消息传递。我完全同意你关于混合功能和数据的观点,这就是为什么我个人认为类对好的代码是有害的。简言之,不是OOP有害,而是IMHO的古典风格。谢谢@torazaburo。我会听从建议的。
console.log(c.printn());