首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有父构造函数参数的Javascript继承

带有父构造函数参数的Javascript继承
EN

Stack Overflow用户
提问于 2017-10-19 18:10:55
回答 2查看 1.9K关注 0票数 1

我目前正在尝试使用javascript中的原型来创建类继承,并且在下面的简单示例中我了解这是如何工作的。

代码语言:javascript
运行
复制
var Person = function(){
    var name = "Steve";
}

var Employee = function(){
    var company = "Stack Overflow";
}

Employee.prototype = new Person;

var employee1 = new Employee();

但是现在假设我希望向构造函数中添加参数,这样我就可以在创建对象时设置值。所以更新后的代码如下所示:

代码语言:javascript
运行
复制
var Person = function(initName){
    var name = initName;
}

var Employee = function(initName, initCompany){
    //How can I use initName to set the value in the prototype class?

    var company = initCompany;
}

Employee.prototype = new Person;

var employee1 = new Employee("Bob", "Intel");

如何使用名称调用Person构造函数?在C# (我最熟悉的语言)中,您只需调用基本构造函数,并传递必要的参数,但在javascript中似乎没有类似的模式。

作为参考,它在C#中可能是这样的:

代码语言:javascript
运行
复制
public class Person
{
    string name;

    public Person(string initName)
    {
        name = initName;
    }
}

public class Employee : Person
{
    string company;

    public Employee(string initName, string initCompany) : base(initName)
    {
        company = initCompany;
    }
}

var employee1 = new Employee("Bob", "Intel");

免责声明:正如您所看到的,我主要是一个面向对象的程序员,但我目前正在使用javascript,所以从javascript的角度来看,我所要求的一些内容可能是荒谬的,请随时挑战我的预设。

EN

Stack Overflow用户

回答已采纳

发布于 2017-10-19 18:27:51

标准ES5及以下

对于您的示例的具体情况,headmax的回答可以满足您的需要。但是,在一般意义上(即经典继承),C#和其他具有经典继承模型的语言都可能做到这一点,但JavaScript原型模型不可能做到这一点。通过使用组合,您可能会更接近于此,如下所示:

代码语言:javascript
运行
复制
var Person = function(initName){
    var name = initName;
}

var Employee = function(initName, initCompany){
    var innerPerson = new Person(initName);

    var company = initCompany;
}

var employee1 = new Employee("Bob", "Intel");

然后,您想要在Employee类上实现的、反映或扩展Person类的任何附加功能都必须实现为传递,即。调用内部Person对象中的相应函数。诚然,这与实际的继承相去甚远,但它可以为了诸如多态性之类的事情而近似于这种行为。

编辑

我以前完全忘记了这一点,但实际上您可以使用呼叫()适用()实现更多的继承行为。使用call或apply可以在指定的上下文中运行函数(包括对象构造函数),因此可以在子上下文中运行父构造函数,如下所示:

代码语言:javascript
运行
复制
var Person = function(initName){
    var name = initName;
}

var Employee = function(initName, initCompany){
    Person.call(this, initName);
    var innerPerson = new Person(initName);

    var company = initCompany;
}

var employee1 = new Employee("Bob", "Intel");

但是,如果希望能够访问Employee构造函数中的name属性和在Employee中定义的任何其他函数,则需要将name的作用域可见性从var name = ...更改为this.name = ...,以便在正在构造的对象的作用域中( this所指的对象)中可见,而不是绑定到构造函数的作用域。有关所有这些在使用中的出色示例,请参见这里

ES6

随着ECMAScript 2015的采用,您现在可以将类定义封装在语法中,这看起来更像古典继承。但是,您必须记住,这仍然是用幕后的原型继承实现的,所以当call()引擎实际执行代码或巴贝尔重写代码时,很可能会发生类似组合或JavaScript /apply()之类的事情。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46836308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档