我认为我理解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)
答案 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>