首页 > 代码库 > Javascript面向对象

Javascript面向对象

简书上看到了关于Javascript面向对象的一些文章,突然也想写一点自己的见解。

按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法

  • 为什么要面相对象?

  • 首先要了解什么是面向对象,面向对象有哪些特性。我在网上查到关于面相对象现在还没有统一的概念,如果没有统一的概念,我就先随便找个差不多的概念吧。如上,简单的说就是一切都是对象,什么是对象,对象就是对现实世界的抽象。

  • 面相对象有什么特性,我在百度百科上找到几个,然后展开来说。

    • 对象唯一性:对象是对现实世界的抽象,现实世界每样东西都是唯一的,所以对象也是唯一的。
    • 抽象性:对象是对现实世界的抽象,比如说我们抽象人的概念,每个人都有姓名,性别,年龄等等,但是每个人又有不通的性格,然后我们把他抽象了出来,这就是抽象性
    • 继承性:还是人的概念,我们抽象的东西为了实现能够多次的复用,我们一类具有相同属性的东西抽离出来,用于继承这样就能实现代码最大程度上的精简,并且富有逻辑,人类社会不就是这样的么,小明和小红的孩子身上会有小红和小明身上的一些特质,当然,他们的孩子身上也会有,一些小红和小明身上没有的特质。正式因为有这个特性,社会才会进步。
    • 多态性:还是用人来举例子,每个人都有不同的名字,我叫每个人,每个人都会回答给我不一样的名字,但是我用了同样的方法去提问,这就是多态性,相同的方法,在不通的对象上体现出来的结果也是不同的。
  • Javascript如何实现面向对象,要讲Javascript面向对象之前首先要讲一下下面这些神奇的东西。

    • this:对于Javascript来说,一切都是function,那么this的作用域就只是在function里面。这个其实很好理解,但是如果不实际操作那就不一定了,用代码说话。
    var name = "ben";//ben  
                作用域是this.Window
                function persion() {
                alert(this.name);
                //benalert(name);
                //benthis.name = "jill";//ben 
                    function showAge() {
                        var age = 25; 
                        alert(this.name);//jill
                        alert(this.age);//undifine 作用域是 //
                        **this.window,age 的作用域在showAge这个方法中**
                    }
                    showAge();                      
                }
                alert(name);//ben 
                alert(this.name);//ben
                persion();
  • prototype:这个东西太他妈重要了,要是不知道的话,别逼我骂人。

    //首先说明原型
                //这里先借用一个例子
                //来自
                //http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
    
                function DOG(name){
                    this.name = name;
                    this.species = ‘犬科‘;
                }
    
                var dogA = new DOG(‘大毛‘);
                var dogB = new DOG(‘二毛‘);
                 
                dogA.species = ‘猫科‘;
                alert(dogB.species); //示犬科",不受dogA的影响
    
                //下面是原型     
    
    
                function DOG(name){
                    this.name = name;
                }
                DOG.prototype = { species : ‘犬科‘ };
                var dogB = new DOG(‘二毛‘);
                alert(dogA.species); // 犬科
                alert(dogpecies); // 犬科
    
                //下面是借用原型的实现
    
                function Persion(name,age){
                    this.myName = name;
                    this.myAge = age;
                }
    
                persion.prototype = {
                    showName:function(){
                        alert(this.myName);
                    },
                    showAge:function(){
                        alert(this.myAge);
                    }
    
                }
    
                //这样一个人就抽象好了
    
                var jack = new Persion("jack",25);
                var shell = new Persion("shell",25);
    
                jack.showName(); //jack
                shell.showName();//shell
  • constructor

                //其实就是一只构造函数
                function Persion(name,age){
                    this.myName = name;
                    this.myAge = age;
                }
                 Persion.prototype.showName = function(){
                    alert(this.myName);
                 };
                alert(Persion.constructor);
                var jack = new Persion("jack",25);
                alert(jack.constructor);
    
                //但是constructor是会被覆盖的
                function Persion2(name,age){
                    this.myName = name;
                    this.myAge = age;
                }
                 Persion2.prototype ={
                    showName:function(){
                        alert(this.myName)
                    }
                 } 
                alert(Persion2.constructor);
                var rose = new Persion("rose",25);
                alert(rose.constructor);
                //所以如果要用,并不安全,但是我们也要把他给考虑进去
                //毕竟面向对象的都有构造函数
                //咱不能掉队
  • call/apply

                //这个玩意儿相当的重要,重要到无法代替。
                //例子还是要举起来
                function Persion(name,age){
                    this.name = name;
                    this.age = age;
                }
    
                function Student(name,age,school){
                    Persion.call(this,name,age,school)
                    this.school = school;
                }
    
                Student.prototype = {
                    showName:function(){
                        alert(this.name);
                    },
                    showSchool:function(){
                        alert(this.school);
    
                    }
                }
    
                var jack = new Student("Jack","24","Jialidun");
                jack.showName(); // Jack
                jack.showSchool();//Jialidun
    
    
  • arguments

                //这个玩意给我们提供了太多的方便,难以言喻。
                function Persion(name,age){
                    this.name = name;
                    this.age = age;
                }
                Persion.prototype = {
                    setSkills:function(){
                        for(var item in arguments){
                             alert(arguments[item]);
                        }
                    }               
                }
    
                var jack = new Persion("Jack","24");
                jack.setSkills("java","javascript","css","Node.js");
                //这个例子充分表明了这个家伙是干什么用的。
  • 基本概念讲完了,下面讲几个我见到过在项目里面做继承的几个示范:

    • 第一个示范

              /**
              * 实现继承类
              * @private _object
              * */
              function _object (o) {
                   function F() {
                   };
                  F.prototype = o;
                  return new F();
              }
      
      
              /**
              *
              * 实现继承
              * @method inherit
              * @private
              * @param {Object} subType 子类
              * @param {Object} superType 超类
              * */
              function inherit (subType, superType) {
                  var p = _object(superType.prototype);
                  p.constructor = subType;
                  subType.prototype = p;
              }
      
              function Persion(name,age){
                  this.name = name;
                  this.age = age;
              }
      
              Persion.prototype = {
                  showName:function(){
                      alert(this.name);
                  },
                  showAge:function(){
                      alert(this.age);
                  }
              }
      
              function Student(name,age,school){
                  Persion.call(this,name,age);
                  this.school = school;
              } 
      
              inherit(Student,Persion);
      
              Student.prototype.showSchool =  function(){
                      alert(this.school);
              }
      
              var jack = new Student("Jack",25,"jialidun");           
              jack.showName();
              jack.showSchool();
    • 第二个示范

              function Persion(name,age){
                  this.name = name;
                  this.age = age;
              }
      
              Persion.prototype = {
                  showName:function(){
                      alert(this.name);
                  },
                  showAge:function(){
                      alert(this.age);
                  }
              }
      
              function Student(name,age,school){
                  Persion.call(this,name,age);
                  this.school = school;
              } 
      
              Student.prototype = new Persion(); //这块累赘了
              //你知道如果这块不这样,像下面那样
              //Student.prototype 和 Persion.prototype 就将是绑定死的
              //意思就是如果你改变Student.prototype中的东西
              //Persion.prototype也会变,很危险
              //孩子怎么能影响父亲呢,大逆不道不是
              //Student.prototype = Persion.prototype
      
              Student.prototype.showSchool =  function(){
                      alert(this.school);
              }
      
              var jack = new Student("Jack",25,"jialidun");
              jack.showName();
              jack.showSchool();
    • 第三个示范这个例子来自 Leaflet

            /*
             * L.Class powers the OOP facilities of the library.
             * Thanks to John Resig and Dean Edwards for inspiration!
             */
             L = {};
             L.Util ={
    
             extend: function (dest) {
                var i, j, len, src;
    
                for (j = 1, len = arguments.length; j < len; j++) {
                  src = http://www.mamicode.com/arguments[j];
                  for (i in src) {
                    dest[i] = src[i];
                  }
                }
                return dest;
              },
              // create an object from a given prototype
              create: Object.create || (function () {
                function F() {}
                  return function (proto) {
                    F.prototype = proto;
                    return new F();
                };
              })()}
    
            L.Class = function () {};
    
            L.Class.extend = function (props) {
    
              // extended class with the new prototype
              var NewClass = function () {
    
                // call the constructor
                if (this.initialize) {
                  this.initialize.apply(this, arguments);
                }
    
                // call all constructor hooks
                this.callInitHooks();
              };
    
              var parentProto = NewClass.__super__ = this.prototype;
    
              var proto = L.Util.create(parentProto);
              proto.constructor = NewClass;
    
              NewClass.prototype = proto;
    
              // inherit parent‘s statics
              for (var i in this) {
                if (this.hasOwnProperty(i) && i !== ‘prototype‘) {
                  NewClass[i] = this[i];
                }
              }
    
              // mix static properties into the class
              if (props.statics) {
                L.Util.extend(NewClass, props.statics);
                delete props.statics;
              }
    
              // mix includes into the prototype
              if (props.includes) {
                L.Util.extend.apply(null, [proto].concat(props.includes));
                delete props.includes;
              }
    
              // merge options
              if (proto.options) {
                props.options = L.Util.extend(L.Util.create(proto.options), props.options);
              }
    
              // mix given properties into the prototype
              L.Util.extend(proto, props);
    
              proto._initHooks = [];
    
              // add method for calling all hooks
              proto.callInitHooks = function () {
    
                if (this._initHooksCalled) { return; }
    
                if (parentProto.callInitHooks) {
                  parentProto.callInitHooks.call(this);
                }
    
                this._initHooksCalled = true;
    
                for (var i = 0, len = proto._initHooks.length; i < len; i++) {
                  proto._initHooks[i].call(this);
                }
              };
    
              return NewClass;
            };
    
    
            // method for adding properties to prototype
            L.Class.include = function (props) {
              L.Util.extend(this.prototype, props);
            };
    
            // merge new default options to the Class
            L.Class.mergeOptions = function (options) {
              L.Util.extend(this.prototype.options, options);
            };
    
            // add a constructor hook
            L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
              var args = Array.prototype.slice.call(arguments, 1);
    
              var init = typeof fn === ‘function‘ ? fn : function () {
                this[fn].apply(this, args);
              };
    
              this.prototype._initHooks = this.prototype._initHooks || [];
              this.prototype._initHooks.push(init);
            };
    
            //现在开始使用了
            Persion = L.Class.extend({
              options:{
                name:"",
                sex:"",
                age:""
              },
              initialize:function(options){
                this.name = options.name;
                this.sex = options.sex;
                this.age = options.age;
              },
              showName:function(){
                alert(this.name);
              }
            });
    
            Student = Persion.extend({
               options:{
                name:"",
                sex:"",
                age:"",
                school:"",
                score:""
              },
              initialize:function(options){
                Persion.prototype.initialize.call(this, options);
                this.school = options.school;
                this.score = options.score;
              },
              showSchool:function(){
                alert(this.school);
              }
            })
    
            var jack = new Student({
                name:"jack",
                sex:"man",
                age:"25",
                school:"Beijing University",
                score:"A++"
            });
    
            jack.showSchool();
    
     这个继承有点长,但是很用,很有启发。简单写了一下用法,但是不全。
    

name:Jack

QQ:84201088

blog:ggwebsite.duapp.com/spingmvc/cc

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    Javascript面向对象