之前学C语言埋下了深深的面向过程习惯,现在用js开发,想用面向对象的方式来写代码却毫无头绪,完全不知道该如何下手,比如说哪些参数作为对象属性,哪些用来作为方法内部的属性,哪些该写成一个方法,真的是要疯了,跪求大神解救啊!
之前学C语言埋下了深深的面向过程习惯,现在用js开发,想用面向对象的方式来写代码却毫无头绪,完全不知道该如何下手,比如说哪些参数作为对象属性,哪些用来作为方法内部的属性,哪些该写成一个方法,真的是要疯了,跪求大神解救啊!
假如你养狗,
领养
给取个名
然后每天做的事情
喂狗
带狗上厕所
如果下雨呢就把狗关屋里玩
如果没下雨就把狗放
晚上给狗洗澡
之后陪狗玩一会儿
把狗关狗窝里睡觉
就这么直到狗死
把狗埋了
typedef struct {
char* name;
bool alive;
} Dog;
typedef enum { false, true } bool;
int main() {
Dog* pDog = adopt_dog();
name_dog(pDog, "wangwang");
while (pDog->alive) {
feed_dog(pDog);
bring_dog_to_toilet(pDog);
if (is_raining) {
play_inside(pDog);
} else {
play_outside(pDog);
}
bathe(pDog);
play_with(pDog);
goto_sleep(pDog);
}
bury(pDog);
}
可以看到,这一系列的事情,都有一个主体:狗。当然用 javascript 也可以同样的实现,不过要说的是面向对象方式
咱只说OOP,语法搞不懂自己先查查,这要说语句就一言难尽了
var Dog = (function() {
// 构造函数
function Dog() {
this.alive = true;
}
// 静态方法
Dog.adopt = function() {
var dog = new Dog();
// 这里办理领关手续等,最后返回一个 Dog 对象
return dog;
};
// 定义实例方法
Dog.prototype.setName = function(name) {
this.name = name;
};
Dog.prototype.feed = function() { /* ... */ };
Dog.prototype.gotoToilet = function() { /* ... */ };
Dog.prototype.playInside = function() { /* ... */ };
Dog.prototype.playOutside = function() { /* ... */ };
Dog.prototype.playWithOwner = function() { /* ... */ };
Dog.prototype.bathe = function() { /* ... */ };
Dog.prototype.gotoSleep = function() { /* ... */ };
Dog.prototype.bury = function() { /* ... */ };
return Dog;
})();
// 就当这是 main function 了
(function() {
var dog = Dog.adopt();
dog.setName("wangwang");
while (dog.alive) {
dog.feed();
dog.gotoToilet();
if (isRaining) {
dog.palyInside();
} else {
dog.playOutside();
}
dog.bathe();
dog.playWithOwner();
dog.gotoSleep();
}
dog.bury();
})();
可以看出来面向对象和面向过程其它没多大区别,主要流程还是顺序、分支、循环。其主要的区别在于,函数(方法)所附着的对象。
面向过程的时候,操作是没有固定对象的,需要将要处理的对象作为一个参数传递进去。而且对于一个开发者来说,你也不知道对狗操作的函数到底有哪些。
然后,面向对象呢,狗是一个对象。所有狗都有共同的操作(方法)只是在不同的场景下使用不同(选用和顺序不同等)。而每一个对象都有自己的属性,比如狗狗的 name
和 alive
,这和 C 中的结构体是一回事。而在调用的时候,都是以对象为开始,目标对象很明确。而且通过 Dog 的定义,也能知道狗到底有哪些操作可以进行。(虽然一般都是在文档里说清楚的,但是现代IDE的自动完成功能已经在很大程度上代替了翻文档这件事)
其实说白了,面向对象的关键在于对象……没有对象,一切都无从说起。对于由OOP而生的一大堆设计模式,同样可以用单纯的 C 语言实现出来。我记得 Gnome 就是纯 C 风格的界面库嘛……人家 OOP 的 Qt 能干的事情,非 OOP 的 GNome 一样可以干
GNome 后来封装了 OOP 的 C++ 库,这个事情就不要在这里纠结了。
只要多写就好了,我估计大多数人一开始的时候都写过很多class{}包裹起来的过程代码,多写多总结就好了。
最好是找点比较好的项目,那种你自己会使用到的项目,自己尝试写一次,然后再去读别人的实现,反省一下自己的实现有什么问题。
带着实践过程中的问题,再去读OOP的文章和书,就会有体会。
总之,别想速成,这个时间是以年为单位的。
C语言中有struct,使用struct你可以定义自己想要的类型,比如
struct Person{
char name[20];
int age;
char interest[20];
};
可以看出,我们自定义了一个新的类型,有name、age、interest三个属性。
对于JS,我并不太懂,但是我就以C++举例吧,我们可以定义一个Person类
class Person{
private:
char name[20];
int age;
char interest[20];
public:
void Say();
void Run();
};
这个新定义的类,有name、age、interest三个属性,看起来是不是很像C语言中的struct,但是在C++的类中还可以定义类的方法,比如Person是人,可以说话,所以就定义了Say()方法,可以跑步,所以定义了Run()方法。
这里面只是简单的解释,但是面向对象会涉及到很多的知识,比如:设计模式、访问控制符、继承等。
大道至简. 面向对象的起因是希望程序语言更接近人类语言.
过程语言 像是叙事文.
面向对象 则更像是散文.或者说明文. 只要把事务描述清楚就好
面向对象的低层也是过程语言. 一个类.一个方法 最终在被调用时.还是依照调用顺序被执行.面向对象倾向于描述事务而不是描述过程.
使用角度.面向对象处理业务复杂度高的问题时,更有优势.
有人说java是面向对象的. 但你依然可以用它当过程语言来写.所以没啥好与不好. 只有更加适合.
面向对象是一种编程思想, 而不是编程语言.
用C语言也可以写出具有面向对象概念的的程序来, 所谓的面向对象只是编译器提供给你的特性.
面向对象的三大特性--继承,封装与多态要好好去理解, 不是仅仅知道就可以, 而要深入去理解, 以后想深入的话可以试着去理解编译器是怎么来实现这一块东西的. 然后就是多写代码, 从C过渡的话, 最难的应该就是要把代码封装成类吧, 一开始都不习惯的, 都是一个函数一个函数写, 然后调用就好了, 强迫自己把函数功能分类, 一个类只提供同类型的一系列功能, 然后通过实例来调用. 差不多这么多吧.
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
如果只有C经验,JS并不是一门合适的用来体会面向对象的语言。JS中实现面向对象的思路(原型继承)和市面上几乎所有语言都不一样,并且有自己的独特性和难点。
相比较之下Java、C#是“正统面向对象”的选择
以Python、PHP、Ruby为代表的脚本语言虽然大都是{面向过程/面向对象/函数式}的混合,但其中OO部分远比JS容易理解&相对通用
如果你的目标是学JS,那就学JS,如果你的目标是学OOP,那《JS中的OOP》和《其他语言OOP》基本是两件事情。以上。