没有原型的原型继承?

时间:2015-07-03 09:49:42

标签: javascript prototypal-inheritance

我认为我理解JS中的原型继承,但是在编写代码以演示我所拥有的特定想法时遇到了麻烦。考虑这个非常简单的场景,其中Manager对象派生自Employee对象:

function Employee()
{
    this.name = "Axel";
    this.dept = "R&D";
}

function Manager()
{
    Employee.call(this);
    this.reports = ["Report 1", "Report 2", "Report 3"];
}

console.log(new Manager());

输出结果为:

Manager {name: "Axel", dept: "R&D", reports: Array[3]}

奇怪的是,在我看来,我们已经成功地证明了原型继承。但是我们没有在任何地方使用prototype的事实让我感到不安。当然上面的代码不是这样做的吗?

有人可以提供一个显示上述方法失败的示例吗?

(顺便说一下,这个例子来自官方的Mozilla文档,减去了原型的设置:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model

3 个答案:

答案 0 :(得分:2)

new Manager() instanceof Manager
> true
new Manager() instanceof Employee
> false

答案 1 :(得分:2)

你实际上没有继承任何东西。您只需在给定对象上“应用”一个函数。我认为很多函数式语言都可以做到这一点。

继承用于继承,而不仅仅是在给定对象上应用不相关的函数。

在您的示例中,您没有介绍如何继承方法。即使您尝试通过Proxy实现方法继承,例如,这并不意味着您继承了父级。

答案 2 :(得分:2)

我们在各种评论中一直在喋喋不休,但我想举一个可能有助于澄清事情的例子。从原始代码开始:

function Employee()
{
    this.name = "Axel";
    this.dept = "R&D";
}

function Manager()
{
    Employee.call(this);
    this.reports = ["Report 1", "Report 2", "Report 3"];
}

console.log(new Manager());

我们也可以完全同样的事情:

function setEmployee( emp )
{
    emp.name = "Axel";
    emp.dept = "R&D";
}

function Manager()
{
    setEmployee( this );
    this.reports = ["Report 1", "Report 2", "Report 3"];
}

console.log(new Manager());

现在我们还没有使用.call().apply()或其他任何想象的东西。 Manager构造函数只是调用另一个函数并将其this值直接作为参数传递。代码与之前的方式完全相同。

我们可以更进一步:

function setEmployee( emp )
{
    emp.name = "Axel";
    emp.dept = "R&D";
}

function createManager()
{
    var emp = {};
    setEmployee( emp );
    emp.reports = ["Report 1", "Report 2", "Report 3"];
    return emp;
}

console.log(createManager());

现在我们不使用构造函数,甚至不使用this - 我们只是显式创建一个对象并在函数之间传递它,代码仍然做同样的事情!< / p>