gpt4 book ai didi

javascript - 展示与基于类的模型相关的 Javascript 继承优势

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:27:32 24 4
gpt4 key购买 nike

任何人都可以提供一个具体示例来展示 Javascript 的原型(prototype)继承,以说明何时使用传统的基于类的(经典)模型是有益的吗?

我看到的其他问题(例如 Classical Vs prototypal inheritanceWhy was JavaScript implemented using prototypal inheritance?prototype based vs. class based inheritance )只给出了高层次的讨论,而不是具体的例子(最好是你在生产代码中使用过的例子)。

最佳答案

原型(prototype)继承优于经典继承的原因有很多:

  1. 原型(prototype)继承可用于模拟经典继承。它是经典继承的超集。反之亦然。这是因为在经典继承中,类只能从其他类继承。然而,在原型(prototype)继承中,任何对象都可以从任何其他对象继承(在 JavaScript 中,一切都是对象)。
  2. 在 JavaScript 中,每个对象都有一个内部 proto 属性指向它的原型(prototype)对象(Object 对象有一个原型(prototype) null)。由于 JavaScript 是动态的,您可以对原型(prototype)对象进行更改,并且这些更改将反射(reflect)在其内部 proto 属性指向该原型(prototype)的每个对象上(即使在创建对象之后)。因此,它可用于扩展一组对象的功能。

还有很多原因。我会在我记得的时候不断更新它。

下面是一些展示经典继承的 Java 代码:

public class Employee {
public String name;
public String dept;
public Employee () {
this("", "general");
}
public Employee (String name) {
this(name, "general");
}
public Employee (String name, String dept) {
this.name = name;
this.dept = dept;
}
}

public class WorkerBee extends Employee {
public String[] projects;
public WorkerBee () {
this(new String[0]);
}
public WorkerBee (String[] projs) {
projects = projs;
}
}

public class Engineer extends WorkerBee {
public String machine;
public Engineer () {
dept = "engineering";
machine = "";
}
public Engineer (String mach) {
dept = "engineering";
machine = mach;
}
}

这是等效的 JavaScript 代码:

function Employee (name, dept) {
this.name = name || "";
this.dept = dept || "general";
}

function WorkerBee (projs) {
this.projects = projs || [];
}
WorkerBee.prototype = new Employee;

function Engineer (mach) {
this.dept = "engineering";
this.machine = mach || "";
}
Engineer.prototype = new WorkerBee;

关于javascript - 展示与基于类的模型相关的 Javascript 继承优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com