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