gpt4 book ai didi

javascript - 除了模仿经典的类系统之外,JavaScript 原型(prototype)系统还能做什么?

转载 作者:IT王子 更新时间:2023-10-29 02:52:34 25 4
gpt4 key购买 nike

原型(prototype)系统看起来比传统的类系统灵活得多,但人们似乎对模仿传统类系统的所谓“最佳实践”感到满意:

function foo() {
// define instance properties here
}

foo.prototype.method = //define instance method here

new foo()

原型(prototype)系统必须具有所有灵 active ,还可以做其他事情。

除了模拟类之外,原型(prototype)系统是否还有其他用途?原型(prototype)可以做哪些类不能做的事情,或者根本就没有?

最佳答案

原型(prototype)系统提供了一个迷人的模型 metaprogramming ,通过标准对象实现继承。当然,这主要用于表达实例类的既定和简单概念,但没有将类作为需要特定语法来创建它们的语言级不可变结构。通过使用普通对象,您现在可以对“类”做的所有对象(并且您可以做任何事情) - 这就是您所说的灵 active 。

这种灵 active 随后被大量用于以编程方式扩展和更改类,仅使用 JavaScript 的给定对象变异功能:

  • 多重继承的mixins和traits
  • 原型(prototype)可以在继承对象实例化后修改
  • 在创建原型(prototype)时可以轻松使用高阶函数和方法装饰器

当然,原型(prototype)模型本身比仅仅实现类更强大。这些特性很少使用,因为类概念非常有用和广泛,所以原型(prototype)继承的实际功能并不为人所知(并且在 JS 引擎中没有得到很好的优化:-/)

  • 切换现有对象的原型(prototype)可用于显着改变它们的行为。 (全面支持 ES6 Reflect.setPrototypeOf )

  • 一些软件工程模式可以直接用对象来实现。例如 flyweight pattern具有属性,一个 chain of responsibilities包括动态链,哦,当然还有 prototype pattern .

    最后一个很好的例子是带有默认值的选项对象。每个人都使用

    创建它们
      var myOptions = extend({}, defaultOptions, optionArgument);

    但更动态的方法是使用

      var myOptions = extend(Object.create(defaultOptions), optionArgument);

关于javascript - 除了模仿经典的类系统之外,JavaScript 原型(prototype)系统还能做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28783077/

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