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

标签 javascript prototype prototype-programming

原型(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/

相关文章:

javascript - 'this'在javascript中的对象内部未定义,通过另一个属性访问对象的属性

Javascript/meteor android 返回对象到模板

javascript - 未捕获的类型错误,使用原型(prototype)的新手

javascript - 在 for 循环中使用 switch case 播放音频太快

javascript - 从循环外中断循环

javascript - 为什么我无法引用 'this' 上的内容,但使用 var 时却可以?

javascript - 访问闭包范围内的私有(private)(本地)变量

Javascript函数范围和查找父对象的属性

javascript - 下拉动画联系人框

javascript - 如何使用 Q 保留对 promise 链的响应