javascript 是一种面向对象的语言吗?

新手上路,请多包涵

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

原文由 Codier 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 249
2 个回答

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

我认为这些特征确实非常重要。它们使它成为一门优秀的语言,一种日益重要的语言。

原文由 duffymo 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 cphoover 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏