什么是面向对象
先说一个快被程序员玩坏了的梗,把大象放进冰箱需要几步。
第一步:打开冰箱。第二步:把大象放进去。第三步:关上冰箱。
对于程序员来讲,上面的步骤可能就是一个常见的一种面向过程的思维,一步步该做什么已限定,顺序不能交换,这种思维解决一道题很容易, 那一千道呢,如果我下次放的是河马不是大象呢,又或者我下次想放进洗衣机里面呢,如果是这样,以上的流程可能得重写了
这时面向对象的思维就体现出优势了:
首先,创建一个目标 ==》 然后,创建一个动作 ==》 结束
目标中你可以传入任意参数,可以是大象,河马,长颈鹿。其次动作呢,可以传入,放进冰箱,放进洗衣机,放进衣柜。。等等
以上也体现出面向对象的三个特性,封装、继承和多态。
javascript是面向对象的语言吗
起初学习js的时候,认为他就是个面向过程的语言,因为他根本没有类的概念,所以多态和继承的特性更无从说起。
直到去年正式接触前端才发现,js虽无类的概念(Es6中的class只是一颗语法糖),但依然可以实现面向对象的写法
function Animal({ type }) {
this.type = type;
}
function Cat({ name }) {
this.name = name;
}
function Dog({name}){
this.name = name;
}
Cat.prototype = new Animal({ type: "cat" });
Dog.prototype = new Animal({ type: "dog" });
const Yuandan = new Cat({ name: "元旦" });
const Xinba = new Dog({ name: "辛巴" });
console.log(Yuandan.type,Yuandan.name);//cat 元旦
console.log(Xinba.type,Xinba.name);//dog 辛巴
上面代码使用原型继承的方式,简单实现了面向对象的思想。但与大多数面向对象语言相比,js似乎天生缺少类的概念,且没有public,private来限定方法或字段的开放性,那是不是就是说javascript仅仅是一个基于对象的语言呢。
OOP languages are diverse, but the most popular ones are class-based, meaning that objects are instances of classes, which also determine their types
上面的意思大概是,面向对象的语言是多种多样的,最受欢迎的可能就是基于类的那种。像java,c#,c++。
网上还经常会看到javascript是面向对象还是基于对象的争论,那基于对象与面向对象最大的不同呢就是他无法实现继承,如果说javascript是基于对象的语言,那上述这种继承的实现该如何解释呢。
最后说一下,对于这种争论,主要还是看自身对于“对象”这个词本身的理解,即为本身,就得挣脱编程语言的束缚。