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