【问题标题】:How does the 'class' syntax work in javascript?'class' 语法在 javascript 中是如何工作的?
【发布时间】:2020-02-22 19:15:17
【问题描述】:

我正在为 react native 应用程序构建一个 api 服务,我很好奇设置实例然后返回一个在 api 函数周围有闭包的对象之间的区别是什么:

export default AuthApiService = (bearerToken) => {

    const instance = axios.create({
            baseURL: `http://${BASE_URL}`,
            timeout: 5000,
            headers: {
                'Content-Type': 'application/json',
                 Authorization: `Bearer ${bearerToken}`
            }
        })

    const signup = async (email, password) => {
        try {
            const response = await instance.post(`/users`, {
                email,
                password
            })
            return response.data
        } catch (err) {
            console.log('error in signup api call', err, err.response)
            throw err
        }
    }

    const facebookLogin = async () => {
        try {
        } catch (err) {}
    }

    return {
        signup,
        facebookLogin
    }
}

以及一个使用构造函数语法创建对象并可以直接访问对象方法的类,如下所示:

export default class AuthApiService {
    constructor(bearerToken) {
        this.instance = axios.create({
            baseURL: `http://${BASE_URL}`,
            timeout: 5000,
            headers: {
                'Content-Type': 'application/json',
                 Authorization: `Bearer ${bearerToken}`
            }
        })
    }

    signup = async (email, password) => {
        try {
            const response = await this.instance.post(`/users`, {
                email,
                password
            })
            return response.data
        } catch(err) {
            console.log('error in signup api call', err, err.response)
            throw err
        }
    }

    facebookLogin = async () => {
        try {

        } catch(err) {

        }
    }
}

在 javascript 类语法中基本上只是一个创建具有不同原型的对象的函数?

另外,您能否就哪种方法“更好”发表意见?

谢谢

【问题讨论】:

标签: javascript reactjs class react-native ecmascript-6


【解决方案1】:

就像任何其他编程语言一样,类本质上只是遵循面向对象的方法。除了语法和理解方式之外,确实没有太大区别。

特别是在 JavaScript 中,一个关键的区别是使用 constructor 函数从一个类中创建一个对象。稍后可以跟踪此构造函数,而常规函数则不会发生这种情况。 JavaScript 在技术上甚至没有“类”。类语法是在 ES6 中添加的,它几乎是一个标准函数。

关于哪种方法最好,这完全取决于您。在我看来,少即是多,简单和可读性是编程中最重要的事情。我会熟悉这两种方法,特别是如果你计划使用 React,因为 pre-hooks 时代和当前的 hooks 趋势。

【讨论】:

  • “从代码可读性的角度来看,类基本上只是遵循面向对象的方法”是的,你是对的,但在底层,javascript 中的类的实现与“任何其他编程语言”完全不同,这是由于 JavaScript 的原型链。 Javascript 不是基于类的语言,Java 孩子想要 JS 中的类。
  • @DanStarns:通过引入新语法使语言更符合人体工学并没有错。 class 语法主要是一种工具,用于简洁地表达 JS 中存在已久的东西。
  • @FelixKling 哟,我从没说过它有什么问题。
  • @DanStarns:“Java 孩子想要 JS 中的类。” 给人的印象是。
【解决方案2】:

我建议尽可能远离课堂(使用 Javascript)查看factory functions with fun fun function 上的此视频,了解为什么工厂功能通常更好。 Class.prototype 可能很棘手,如果没有使用 .bind(this) 正确绑定方法调用,javascript 中的“this”关键字可能会很棘手。 React 甚至让你在类中绑定方法。

这并不是说类在任何方面都不正确,只是它们在 javascript 中可能会变得不必要地复杂。

【讨论】:

  • 这里没有什么我可以同意的。类在 Javascript 中一点也不难,尤其是在 class 语法中。虽然在某些情况下,class 定义以外的其他东西是正确的方法,但有无数的决定很有意义并且易于编程和使用。同样,工厂函数也有自己的位置,但没有理由从不使用类而总是使用工厂函数。例如,我想看看只使用工厂函数时继承是多么简单。
  • 所以我假设你没有看到关于类的部分不是不正确的吗?我没有说类太复杂以至于你永远不应该使用它们,只是 javascript 使它们变得不必要地复杂。并且使用 Object.create 你可以继承,所以说起来很简单。
  • 您应该阅读一下medium.com/javascript-scene/…
  • 我已经读过了。这是一篇观点文章,我不同意其中的大部分内容。仅仅因为它在互联网上并不能使它正确或每个人都认为是正确的观点。我有权发表我的意见。我在使用class 语法时没有遇到任何问题,而且我发现它更简单、更简洁、易于继承和扩展、更易于调试等......
  • 感觉讽刺地说,但你呢。就像我说的,类没有错,只是在 JS 中比大多数其他语言复杂得多(不必要地如此) Checkout react hooks as hooks begin to phase out out React classes.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2011-02-12
  • 1970-01-01
  • 2021-04-10
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多