javascript - 面向过程向面向对象的转变,跪求!
巴扎黑
巴扎黑 2017-04-10 15:47:08
0
10
591

之前学C语言埋下了深深的面向过程习惯,现在用js开发,想用面向对象的方式来写代码却毫无头绪,完全不知道该如何下手,比如说哪些参数作为对象属性,哪些用来作为方法内部的属性,哪些该写成一个方法,真的是要疯了,跪求大神解救啊!

巴扎黑
巴扎黑

reply all (10)
刘奇

如果只有C经验,JS并不是一门合适的用来体会面向对象的语言。JS中实现面向对象的思路(原型继承)和市面上几乎所有语言都不一样,并且有自己的独特性和难点。

相比较之下Java、C#是“正统面向对象”的选择
以Python、PHP、Ruby为代表的脚本语言虽然大都是{面向过程/面向对象/函数式}的混合,但其中OO部分远比JS容易理解&相对通用

如果你的目标是学JS,那就学JS,如果你的目标是学OOP,那《JS中的OOP》和《其他语言OOP》基本是两件事情。以上。

    左手右手慢动作

    假如你养狗,

    • 领养

    • 给取个名

    然后每天做的事情

    • 喂狗

    • 带狗上厕所

    • 如果下雨呢就把狗关屋里玩

    • 如果没下雨就把狗放

    • 晚上给狗洗澡

    • 之后陪狗玩一会儿

    • 把狗关狗窝里睡觉

    就这么直到狗死

    • 把狗埋了

    用 C 来实现是什么样呢

    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 也可以同样的实现,不过要说的是面向对象方式

    用 javascript OOP 来实现是什么样呢

    咱只说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(); })();

    有啥一样有啥不一样

    可以看出来面向对象和面向过程其它没多大区别,主要流程还是顺序、分支、循环。其主要的区别在于,函数(方法)所附着的对象。

    面向过程的时候,操作是没有固定对象的,需要将要处理的对象作为一个参数传递进去。而且对于一个开发者来说,你也不知道对狗操作的函数到底有哪些。

    然后,面向对象呢,狗是一个对象。所有狗都有共同的操作(方法)只是在不同的场景下使用不同(选用和顺序不同等)。而每一个对象都有自己的属性,比如狗狗的namealive,这和 C 中的结构体是一回事。而在调用的时候,都是以对象为开始,目标对象很明确。而且通过 Dog 的定义,也能知道狗到底有哪些操作可以进行。(虽然一般都是在文档里说清楚的,但是现代IDE的自动完成功能已经在很大程度上代替了翻文档这件事)

    其实说白了,面向对象的关键在于对象……没有对象,一切都无从说起。对于由OOP而生的一大堆设计模式,同样可以用单纯的 C 语言实现出来。我记得 Gnome 就是纯 C 风格的界面库嘛……人家 OOP 的 Qt 能干的事情,非 OOP 的 GNome 一样可以干

    GNome 后来封装了 OOP 的 C++ 库,这个事情就不要在这里纠结了。

      Ty80

      设计模式
      设计模式
      设计模式

      重要的东西说三遍,不会使用设计模式的思想你永远写不了好的面向对象,而且设计模式也很简单

        Ty80

        面向对象一般要配合着设计模式,我也是只会过程式不会抽象面向对象,也正在学习中。你把面向对象学完应该接着学习设计模式,会有帮助的

          PHPzhong

          我就不信你写c的时候不大量使用结构体和配套的函数。

            刘奇

            只要多写就好了,我估计大多数人一开始的时候都写过很多class{}包裹起来的过程代码,多写多总结就好了。

            最好是找点比较好的项目,那种你自己会使用到的项目,自己尝试写一次,然后再去读别人的实现,反省一下自己的实现有什么问题。

            带着实践过程中的问题,再去读OOP的文章和书,就会有体会。

            总之,别想速成,这个时间是以年为单位的。

              Ty80

              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过渡的话, 最难的应该就是要把代码封装成类吧, 一开始都不习惯的, 都是一个函数一个函数写, 然后调用就好了, 强迫自己把函数功能分类, 一个类只提供同类型的一系列功能, 然后通过实例来调用. 差不多这么多吧.

                      Latest Downloads
                      More>
                      Web Effects
                      Website Source Code
                      Website Materials
                      Front End Template
                      About us Disclaimer Sitemap
                      php.cn:Public welfare online PHP training,Help PHP learners grow quickly!