【问题标题】:Is javascript an object oriented language?javascript是面向对象的语言吗?
【发布时间】:2011-05-02 00:56:57
【问题描述】:

我学习 javascript 已经有一段时间了。我读的书说 Javascript 是一种函数式解释语言。但是我遇到的许多其他资源都说 Javascript 是面向对象的。 那么 JS 到底属于哪一个呢?还是真的不重要? 谢谢

【问题讨论】:

  • 我认为你必须在语言本身的结构和它的使用方式之间做出改变。它通常以更实用的方式使用。尽管如此,它仍然是一种完全面向对象的语言,因为其中的所有内容都是一个对象(除了少数原始值)。甚至函数也是对象。
  • 另外,Javascript 不一定是“解释”的。虽然一些早期的实现可能已经被解释过,但所有现代快速 Javascript 引擎都是任何定义的编译器。其中一些甚至生成本机机器代码。

标签: javascript


【解决方案1】:

JavaScript确实有对象。我会说它是一个混合体:解释型、功能型、面向对象和动态。

我认为这些特征确实非常重要。它们是使它成为一门好语言的原因,它每天都变得更加重要。

【讨论】:

  • 编程语言很难同时兼具功能性和“面向对象”(事实并非如此);这迫使程序员实例化函数(并有其局限性)来模拟一个类。这就是为什么我会说 javascript 实际上不是一门很好的语言。
  • Python 既是函数式又是面向对象的。语言也很差吗?我打电话给你的评论。
  • 由于我没有足够的 Python 经验,我无法对此发表评论。但是由于 javascript 并不是真正的面向对象语言,因此模拟类通常会变得非常困难。
  • 它是一种面向对象的语言。它使用原型继承,而不是像许多其他 C 风格语言(Java、C#、C++)那样的经典继承。正如答案所指出的,它还具有许多其他特征。根是对象。它是像 SmallTalk 或 Eiffel 这样的绝对纯粹的 OO 吗?不,但大多数其他人也不是。
  • 这些天我看不到 Smalltalk 的发展。埃菲尔?从不重要。
【解决方案2】:

JavaScript 不是传统的面向对象语言,因为无法定义典型的类。它改用prototypal inheritance

有一些方法可以使用 Prototype 和 MooTools 等框架来模拟传统类,尽管它实际上不是原生 JavaScript 构造。

最后,只要您可以编写易于理解和可维护的代码,这并不重要。查看jQuery Fundamentals 等资源。尽管它是特定于 jQuery 的,但第 2、9 和 10 章适用于所有 JavaScript 开发人员。

【讨论】:

    【解决方案3】:

    是的。您可以使用 javascript 作为传统的面向对象语言:

    //Animal Class
    function Animal(_name){
        this.name = _name; 
    }
    
    Animal.prototype.sleep = function(){
       console.log('zzzz');
    }
    
    Animal.prototype.talk = function(){
       console.log('Hey! how\'s it going?');
    }
    
    // Dog Class
    function Dog(_name){
       // call the parent constructor
       Animal.apply(this,arguments);
    }
    
    // extends the Animal prototype chain
    Dog.prototype = new Animal();
    Dog.constructor = Dog;
    
    Dog.prototype.talk = function(){
       console.log('woof woof');
    }
    
    //MAIN 
    var dog = new Dog('roofus');
    
    dog.sleep(); //produces 'zzzzz'
    dog.talk(); //produces 'woof woof'
    

    这种技术模拟经典继承模型,通常被称为“伪经典继承”

    Javascript 是围绕原型继承构建的。意思不是扩展类,而是扩展对象(原型)。您也可以通过这种技术使用继承。

    var Animal = (function(){
    
        //everything inside the closure 
        //above outside returned object acts as a private variable
        var private = "private variable";
    
        //everything returned is a public field of the object
        var self =  {};
        self.name = null;
        self.sleep = function(){
                console.log('zzzzz');
        };
        self.talk =  function(){
               console.log('hey how\s it going');
        };
    
        return self;
    
    })();
    
    var Dog = (function(){
       var self = Object.create(Animal);
       self.talk = function(){
          console.log('woof woof')
       };
    
    })();
    
    
    //MAIN 
    var dog = Object.create(Dog);
    dog.name = "roofus";
    
    dog.sleep(); //produces 'zzzzz'
    dog.talk(); //produces 'woof woof'
    

    了解其运作方式/原因非常重要。 Object.create 创建一个新对象并将该对象的隐藏“原型”(proto)作为您传入的参数。javascript 的工作方式本质上是当您访问对象的字段(原始,方法,对象)js引擎循环遍历该对象上定义的属性,如果找到该属性,则返回,否则它会检查对象的隐藏原型proto属性并执行相同的操作。它递归地执行此操作,直到搜索到整个原型链或返回某些内容。

    另外,重要的是要记住 OOP 不仅仅是继承。重要的 OOP 结构(如组合和封装)是编写结构良好的 javascript 的基础。

    【讨论】:

    • 这真的很有帮助!
    【解决方案4】:

    JavaScript 支持函数式编程技术,但我不相信您可以将其归类为函数式语言本身。现在越来越多(所有主要浏览器?)它也没有被解释。所以我猜你可以说它不是“功能解释语言”。

    如果您对 JavaScript 中的函数式编程感兴趣,请查看此问题的一些答案以获得更多想法和参考:Javascript as a functional language

    【讨论】:

      【解决方案5】:

      取决于您所说的面向对象语言。 JS 没有(原始)类,但它有

      • 使用点符号的方法调度:x.method()
        • 因此,多态性
      • 继承(尽管是​​原型)
      • 垃圾回收
      • 一切都是对象

      在我看来已经够OO了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2010-09-11
        • 2010-09-06
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多