JavaScript中的Prototypal vs Functional OOP

fue*_*sjr 14 javascript oop

编写面向对象脚本时每种类型/方法的优缺点是什么?

就个人而言,我发现闭包(功能性方法)是一种将状态封装得更自然,也许更优雅的方式.但是,我听说在JavaScript实现中这种闭包的使用速度较慢.

我至少想知道原型方法最合适的地方.

mac*_*ost 14

"功能"风格(大多数人称之为"传统OOP"):

  • 优点: OOP以每个人(或至少Java程序员)熟悉的方式工作,包括"真正的"私有方法和变量
  • 缺点: Javascript不是为这种类型的OOP设计的,所以你最终会跳过许多箍来使其工作.这些箍使调试更加困难,并且还增加了性能成本(尽管确切的成本将取决于您使用它们的方式/数量)

原型风格:

  • 优点:它是Javascript设计方式的OOP.
  • 缺点:这不是你习惯的(除非你有其他原型继承语言的背景)

因此,如果性能对您来说不是一个大问题,并且您只熟悉传统的OOP ...那就去吧(来自APress的Pro Javascript Design Patterns,有一个很好的模式).但是,如果性能很重要或者您担心额外的抽象层会使调试复杂化,请花点时间阅读原型继承的工作原理; 你会成为一个更好的Javascript程序员.

PS如果你担心没有真正的"私人"方法与原型风格,我强烈建议阅读:http: //snook.ca/archives/javascript/no-love-for-module-pattern 它提供了一个很好的解释为什么真正的"私人"成员实际上是一件坏事(至少在大多数JS开发环境中).


Jim*_*mmy 7

使用原型来表示对象继承.使用功能代码复制它是非常复杂的(我假设你的意思是你在一个闭包中有私有成员的模式并返回一个包含你的公共成员的对象?)

function Animal() { }
function Cat () { }

Animal.prototype.sleep = function() { /* blah */ };
Cat.prototype = new Animal;
Cat.prototype.meow = function() { /* blah */ };

var simon = new Cat();
simon.sleep();
simon.meow();
Run Code Online (Sandbox Code Playgroud)