javascript是面向对象的语言吗?

时间:2011-05-02 00:56:58

标签: javascript

我一直在学习javascript。我读过的这本书说Javascript是一种功能性解释语言。但我遇到的许多其他资源都说Javascript是面向对象的。    那JS究竟属于哪一个?或者它真的没关系? 感谢

5 个答案:

答案 0 :(得分:18)

JavaScript 确实拥有对象。我会说这是一种混合:解释,功能,面向对象和动态。

我认为这些特征确实非常重要。它们使它成为一种优秀的语言,每天都更重要。

答案 1 :(得分:5)

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

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

最后,只要你能编写易于理解和易于维护的代码,它就无所谓了。查看jQuery Fundamentals等资源。即使它是特定于jQuery的,第2章,第9章和第10章也适用于所有JavaScript开发人员。

答案 2 :(得分:5)

是。您可以将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的基础。

答案 3 :(得分:0)

JavaScript 支持函数式编程技术,但我不相信你可以把它作为一种函数式语言本身。这些天(所有主流浏览器?)越来越不被解释。所以我想你可以说它是不是一种“功能性解释语言”。

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

答案 4 :(得分:0)

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

  • 带点符号的方法调度:x.method()
    • 因此,多态性
  • 继承(虽然是原型)
  • 垃圾收集
  • 一切都是对象

对我来说足够OO了!