JavaScript 中的原型继承到底是如何工作的?

2024-04-10

我仍然没有完全理解 JavaScript 中的继承二分法(原型与经典)。

If the class只是原型上的语法糖,我应该如何去糖化它?

您可以向我展示使用类和原型创建 React 元素的不同方法(即没有class & React.createClass)?

那么,有没有一种方法可以使用本机获取有状态组件Object.create?

像这样:

const Hello = Object.create(React.Component.prototype, {
  componentDidMount: {
    value: function() {
      alert('Mounted');
    }
  },
  render: {
    value: function() {
      return <div>I love StackOverflow community! It is so helpful and friendly</div>;
    }
  }
});

ReactDOM.render(<Hello />, document.getElementById('root'));

由于内部库的限制,似乎这样的东西不起作用。但为什么我们不能以更自然的 JavaScript 原型性质来使用它呢?

官方文档中有一条注释:https://facebook.github.io/react/docs/composition-vs-inheritance.html#so-what-about-inheritance https://facebook.github.io/react/docs/composition-vs-inheritance.html#so-what-about-inheritance

[...]我们还没有发现任何我们建议创建组件继承层次结构的用例

但不是class主要是关于继承?

我很困惑,想听听您对我的做法和想法的错误看法?

我在 Reactiflux 上问过这个问题,Brendan Hurley 提出了这个:https://codepen.io/niechea/pen/xdVEvv?editors=0010 https://codepen.io/niechea/pen/xdVEvv?editors=0010

function MyComponent(props) {
  this.props = props;
  this.state = {
    clickCount: 0,
  };
}

MyComponent.prototype = Object.create(React.Component.prototype);

MyComponent.prototype.clickHandler = function() {
  this.setState({
    clickCount: this.state.clickCount + 1,
  });
}

MyComponent.prototype.render = function() {
  return (
    <div>
      <p>Hello, {this.props.name}.</p>
      <p>You have clicked {this.state.clickCount} time(s)!</p>
      <button onClick={this.clickHandler.bind(this)}>Click me</button>
    </div>
  );
}

ReactDOM.render(<MyComponent name="Bogdan" />, document.getElementById('app'));

他的解决方案真的是原型吗?


以下是一些参考:

  • http://javascript.crockford.com/prototypal.html http://javascript.crockford.com/prototypal.html
  • https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3 https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3
  • http://henleyedition.com/making-inheritance-make-sense-with-object-create/ http://henleyedition.com/making-inheritance-make-sense-with-object-create/

* 问题主要是关于继承,而不是关于React。这里的React只是一个参考。


如果类只是原型上的语法糖,我会如何 应该脱糖吗?

例如这是一个好文章 https://www.sitepoint.com/understanding-ecmascript-6-class-inheritance/就此事。所以如果你创建了一个实体Animal using class:

class AnimalES6 {
    constructor(name) {
        this.name = name;
    }

    doSomething() {
        console.log("I'm a " + this.name);
    }
}

var lionES6 = new AnimalES6("Lion");
lionES6.doSomething();

原型版本看起来像这样:

var Animal = (function () {
    function Animal(name) {
        this.name = name;
    }
    // Methods
    Animal.prototype.doSomething = function () {
        console.log("I'm a " + this.name);
    };
    return Animal;
})();

var lion = new Animal("Lion");
lion.doSomething();

更复杂的是extend功能(例如继承的 TypeScript 模拟):

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};

您可以向我展示创建 React 元素的不同方法吗 有类和原型(即没有类和 React.createClass)?

这个问题还有一些已经回答的问题,例如this one https://stackoverflow.com/questions/40366024/how-to-implement-normal-es5-prototypal-inheritance-in-react.

但在我看来,真正的问题仍然是:你想要_____吗?

既然您链接了 Eric Elliot 的文章,您可能会注意到围绕 EC6 存在一种争议classJavaScript 世界中的 es。除了您发布的示例之外,还有更多开发人员的一些意见汇总,例如这个 github 仓库 https://github.com/joshburgess/not-awesome-es6-classes/, here https://www.quora.com/Are-ES6-classes-bad-for-JavaScript和更多。也有文章捍卫其目的class...

无论如何,React 的创造者似乎已经接受了它的“邪恶”class正如您所指出的,当您尝试在 React 中使用原型方法时,您会遇到问题。所以我认为:为什么要费心呢?我也更喜欢 javascript 的原型性质,也喜欢 ReactJS 框架,但在我看来,最好提出一些结合了两者优点的新框架,比如“Protypal React”,而不是试图强制原型化当 React 不打算用于此类用途时。

但类不主要是关于继承吗?

这可能在评论中得到了回答,但没有。类有其优点Composition设计理念重于继承。它取决于需求 https://en.wikipedia.org/wiki/Composition_over_inheritance但是许多框架/库都建立在面向对象的语言之上,这些语言使用类包含组合而不是继承,例如统一。

不管怎样,这是一个很好的问题,我也想分享我对此事的想法。希望它能帮助您形成意见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中的原型继承到底是如何工作的? 的相关文章

随机推荐

  • 如何直接从 Android Wear 通过 WiFi 发出 HTTP 请求?

    如何在 Android Wear 上执行 HTTP 请求或打开套接字 我曾经认为这是不可能的但是应用程序说以下内容 如果您有配备 Android Wear 5 1 和 WiFi 的智能手表 即使您的手机处于关闭状态 也能正常工作 我测试了它
  • Java 应用程序可以使用 Aero Glass 效果吗?

    基于Swing的Java能否在Windows Vista 7下实现Aero Glass效果作为背景 从 Java SE 6 开始 Swing 的 Windows 原生外观使用 Aero Chet Haase 发表了一篇博客文章 其中包含有关
  • 线程“main”中出现异常 java.lang.SecurityException:禁止的包名称:java.lang

    我是 Java 新手 我有一个程序返回以下错误 我完全无法弄清楚 我用谷歌搜索了一切 你们能帮我吗 package java lang public class S1 public static void main String args
  • Rails 并发请求

    所以我有一个 Rails 应用程序可以解析一个长 json 文件 在此期间它向外部 API 发送请求 这似乎需要很长时间 我的问题是 是否像将每个请求放入单独的线程中以加快速度一样简单 我不明白为什么我不能同时运行 3 或 4 个线程来发送
  • jQuery 排序导致 iOS Safari 冻结

    我有一个页面使用 jQuery 加载 XML 文件 然后将其内容输出到页面 最近 我在输出中添加了排序功能 导致 iPod Touch 上的 Safari 挂起 1 分钟以上或 2 分钟以上 取决于我排序的字段数量 而在 iPad 上挂起不
  • 无法调试,致命信号 6 (SIGABRT) 位于 0x00007c37(代码=-6)

    我遇到了以下情况 无法调试 Android 应用程序 我可以运行它 但无法调试它 我开始了全新的项目 复制了所有内容并且它有效 意味着能够调试 但又得到了这个 我在模拟器和手机上都尝试过 但没有成功 我使用的是Android Studio
  • Angular 2 - ngShow 等效吗? [复制]

    这个问题在这里已经有答案了 根据我对文档的解释 如果我希望能够默认隐藏一个元素 并在单击链接时显示该元素 那么以下应该可以工作吗 在 app app component ts 中 newTrustFormVisible false 在 ap
  • 在哪里可以找到“Microsoft.VisualStudio.TestTools.UnitTesting”缺失的 dll?

    我的 C Visual Studio 项目中出现以下错误 命名空间 Microsoft 中不存在类型或命名空间名称 VisualStudio 是否缺少程序集引用 我还尝试查找 microsoft dll 文件 但找不到任何参考 我是否搜索了
  • 容器和包装的区别

    在编程语言 例如 Java 中 有什么区别container and wrapper 或者有什么区别 我听过这两个术语的使用都很模糊 在编程语言中这个词容器通常用于可以包含多个元素的结构 例如Map a Set or a List 这些结构
  • Python:使用正则表达式获取列表索引?

    在Python中 如何获取列表中项目的位置 使用list index 使用模糊匹配 例如 如何获取以下形式的所有水果的索引 berry在下面的列表中 fruit list raspberry apple strawberry Is it p
  • 如何处理文件名中的破折号

    在装有 Windows 7 的 PC 上 我使用一个简单的批处理脚本来重命名一些 Excel 文件 并在其父文件夹名称前面添加 for f delims i in dir b AD do cd i for f delims j in dir
  • 如何将控制台输出发送/拆分/复制到 R 中的变量中?

    如何将某些代码的输出放入变量中 我希望该输出仍然发送到控制台 我更喜欢sink符号 我不想使用capture output有两个原因 它要求相应的代码是单个函数 我不想通过创建函数来捕获输出来使我的代码复杂化 它不允许捕获的输出仍然进入控制
  • PHP - getimagesize() 重定向不起作用

    问题 getimagesize 对于某些 URL 不起作用 尤其是重定向的 URL 我用谷歌搜索并检查了 stackoverflow 但无济于事 这是我在本地计算机上看到的内容 var dump getimagesize http gan
  • VB6 应用程序调用 .NET DLL OutOfMemory 异常

    我们有一个调用 NET DLL 的 VB6 应用程序 有时 在 VB6 应用程序运行很长时间并多次调用 NET 代码后 NET 方面会抛出 OutOfMemory 异常 即使计算机上有足够的可用内存 VB6 的内存空间也远未达到极限 NET
  • lapply-ing 与“$”函数

    我正在经历一些例子 https github com hadley devtools wiki Functionals exercises 1在哈德利的泛函指南中 遇到了一个意想不到的问题 假设我有一个模型对象列表 x 1 3 y 3 1
  • 使用 Multipart/Form-Data Enctype 进行表单验证失败后,Struts 1 丢失请求参数

    我有一个简单的 Struts 表单 它有几个文本字段和一个文件字段 这enctype is multipart form data在我的表格上 我在中验证actionform的 验证方法 如果文本字段为空 我会返回错误 是必要的 除了可见字
  • 如何在 R 中查找 DTM 中的术语频率?

    我一直在使用 tm 包创建 DocumentTerm 矩阵 如下所示 library tm library RWeka library SnowballC src lt DataframeSource data frame data3 Jo
  • $Proxy$_$$_Weld$EnterpriseProxy$ 代理子类是如何实现的?

    在 Java EE 7 应用程序中 假设我有一个会话 bean 类 Stateless public class MyEJB 在 Glassfish 4 下调试时 我可以看到一个名为MyEJB Proxy Weld EnterprisePr
  • 在处理 Angular2-typescript 项目时如何在 WebStorm 中隐藏 .js 和 .map 文件

    我尝试将扩展添加到 gitignore但结果如下 这些文件并未完全隐藏 在没有内置 TypeScript 编译器的情况下使用 WebStorm 时 例如 因为您正在使用其npm start已经完成编译的脚本 并且其他方法不起作用 您可以为
  • JavaScript 中的原型继承到底是如何工作的?

    我仍然没有完全理解 JavaScript 中的继承二分法 原型与经典 If the class只是原型上的语法糖 我应该如何去糖化它 您可以向我展示使用类和原型创建 React 元素的不同方法 即没有class React createCl