【问题标题】:Prototypal vs Functional OOP in JavaScriptJavaScript 中的原型与函数式 OOP
【发布时间】:2010-12-06 03:44:36
【问题描述】:

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

就我个人而言,我发现闭包(函数式?方法)是一种更自然地封装状态的方法,也许更优雅。然而,我听说在 JavaScript 实现中使用闭包的速度较慢。

我至少想知道原型方法在哪里最合适。

【问题讨论】:

    标签: javascript oop


    【解决方案1】:

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

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

    原型风格:

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

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

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

    【讨论】:

    • 原型样式暴露了任何想要的“私有”成员难道不是一个缺点吗?
    • 在一个有很多人在编辑你的代码的大公司里,你想阻止那些“X部门的混蛋”弄乱你的代码,私人成员可能提供一些好处。就个人而言,我从未见过这种情况。相反,我想你会发现 JS 是由小团队或个人开发的,对他们来说,私有成员都很麻烦而且没有任何好处(例如,你不能在运行时使用 Firebug 来检查它们)。对于大多数人来说,下划线模式(即调用私有方法“foo”“__foo”)足以区分“私有”成员和公共成员。
    • Fuentesjr:爱他们还是恨他们,我同意你的观点,“真正的私人成员”与这个讨论有关,所以我相应地编辑了我的答案。
    • 感谢您的出色回答。就我个人而言,没有 true 私人成员我很好,因为我来自 Python 背景,每个人都被认为是负责任的成年人。
    【解决方案2】:

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

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多