我目前正在尝试使用javascript中的原型来创建类继承,并且在下面的简单示例中我了解这是如何工作的。
var Person = function(){
var name = "Steve";
}
var Employee = function(){
var company = "Stack Overflow";
}
Employee.prototype = new Person;
var employee1 = new Employee();但是现在假设我希望向构造函数中添加参数,这样我就可以在创建对象时设置值。所以更新后的代码如下所示:
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#中可能是这样的:
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的角度来看,我所要求的一些内容可能是荒谬的,请随时挑战我的预设。
发布于 2017-10-19 18:27:51
标准ES5及以下
对于您的示例的具体情况,headmax的回答可以满足您的需要。但是,在一般意义上(即经典继承),C#和其他具有经典继承模型的语言都可能做到这一点,但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可以在指定的上下文中运行函数(包括对象构造函数),因此可以在子上下文中运行父构造函数,如下所示:
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()之类的事情。
https://stackoverflow.com/questions/46836308
复制相似问题