JavaScript中OOP——>>>面向对象中的继承/闭包

  前  言

 OOP 

 JavaScript中OOP——>>>面向对象中的继承/闭包

1.1面向对象的概念

  
  使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法。
      >>> 继承的两方,发生在两个类之间。

1.2JS模拟实现继承的三种方式:

         首先,了解一下call/apply/binb:通过函数名调用方法,强行将函数中的this指向某个对象;
            call写法:  func.call(func的this指向的obj,参数1,参数2...);
            apply写法:  func.apply(func的this指向的obj,[参数1,参数2...]);
              binb写法:  func.binb(func的this指向的obj)(参数1,参数2...);
         
           call与apply的唯一区别:在于接收func函数的参数方式不同。call采用直接写多个参数的方式,而apply采用是一个数组封装所有参数。

   ① 扩展Object实现继承
             1:定义父类
                     function Parent(){}
             2:定义子类
                    funtion Son(){}
             3:通过原型给Object对象添加一个扩展方法。
                    Object.prototype.customExtend = function(parObj){
                        for(var i in parObj){
                            // 通过for-in循环,把父类的所有属性方法,赋值给自己
                               this[i] = parObj[i];
                        }
                    }
              4:子类对象调用扩展方法
                      Son.customExtend(Parent);

① eg:

 1     // 1.定义父类
 2         function Person(name,age){
 3             this.name = name;
 4             this.age = age;
 5             this.say = function(){
 6                 alert(this.name+":"+this.age);
 7             }
 8         }
 9         // 2.定义子类
10         function Student(no){
11             this.no = no;
12             this.add = function(a,b){
13                 alert(a+b);
14             }
15         }
16         function Programmer(lang){
17             this.lang = lang;
18             this.codding = function(){
19                 alert("我爱敲代码!敲代码使我快乐!");
20             }
21         }
22         // 3.通过原型给Object对象添加一个扩展方法。
23         Object.prototype.customExtend = function(parObj){
24             for(var i in parObj){
25                 // 通过for-in循环,把父类的所有属性方法,赋值给自己
26                    this[i] = parObj[i];
27             }
28         }
29
30         var p = new Person("小明","18");
31         var s = new Student("0001");
32         s.customExtend(p);//现在s继承了p的所有属性和方法。
33         console.log(s)
34
35         var pro = new Programmer("JavaScript");
36         pro.customExtend(p);
37         console.log(pro)
38
39
40
41         

  
    ② 使用call/apply/binb.
                1:定义父类
                    funtion Parent(””,””,””){}
                2:定义子类
                    function Son(””,””,””){}
                3:在子类中通过call方法/apply/binb方法去调用父类。
                    function Son(){
                        Parent.call(this,””,””,””);// Parent.apply(this,[””,””,””]);//Parent.binb(this)(””,””,””);
                    }

② eg:

 1         function Person(name,age){
 2             this.name = name;
 3             this.age = age;
 4             this.say = function(){
 5                 alert("我叫:"+this.name+";今年:"+this.age+"岁");
 6             }
 7         }
 8
 9         /** 文档注释,调用函数时,可以看到注释内容。
10          *
11          * no:学员编号
12          * stuName:学员姓名
13          * stuAge:学员年龄
14          */
15         function Student(no,stuName,stuAge){
16
17             this.no = no;
18             Person.call(this,stuName,stuAge);
19             // 执行上述代码,相当于将下面的代码执行一遍。并且把原来Person类的this直接替换为Stundet的this(当实例化Student时的那个对象)
20
21 //            this.name = "张三";
22 //            this.age = 14;
23 //            this.say = function(){
24 //                alert("我叫:"+this.name+";今年:"+this.age+"岁");
25 //            }
26         }
27
28         var stu = new Student(12,"zhangsan",14);
29         stu.say();
30
31         console.log(stu)
32
33         //Person("zhangsan","123");

    
   ③ 使用原型继承
                1:定义父类
                   function Parent(””,””,””){}
                2:定义子类
                   function Son(””,””,””){}
                3:把在子类对象的原型对象声明为父类的实例。
                   Son.prototype = new Parent(””,””,””);

③ eg:

 1         function Person(name,age){
 2             this.name = name;
 3             this.age = age;
 4             this.say = function(){
 5                 alert("我叫:"+this.name+";今年:"+this.age+"岁");
 6             }
 7         }
 8
 9         /** 文档注释,调用函数时,可以看到注释内容。
10          *
11          * no:学员编号
12          * stuName:学员姓名
13          * stuAge:学员年龄
14          */
15         function Student(no){
16             this.no = no;
17         }
18
19         Student.prototype = new Person("张三",14)
20
21         var stu = new Student(12);
22
23         stu.say();
24
25         console.log(stu)
26
27         //Person("zhangsan","123");

1.3面向对象中的闭包

  
   1、 全局变量:函数外声明的变量
             局部变量:函数内声明的变量
         
             在JS中,函数为唯一的局部作用域,而if、for等其他{}没有自己的作用域
         
             所以,函数外不能访问局部变量。其实,变量在函数执行完毕以后,占用的内存就被释放。
         
          2、如何访问函数私有变量?
             JS中,提供了一种"闭包"的概念:在函数内部,定义一个子函数,可以用子函数访问父函数的私有变量。执行完操作以后,将子函数通过return返回。
         
                 function func2(){
                    var num = 1;
                    function func3(){
                        var sum = num+10;
                        alert(sum);
                    }
                    return func3;
                }
                
                var f = func2();
                f();
         
          3、闭包的作用:
             ① 访问函数的私有变量;
             ② 让函数的变量始终存在于内存中,而不被释放。

时间: 2024-10-14 14:40:36

JavaScript中OOP——>>>面向对象中的继承/闭包的相关文章

javascript 中的面向对象中比较好的资料

http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_

PHP中的面向对象 中的类(class)

2.11 上午讲的是面向对象中的类(class),一个非常抽象的概念, 类里面成员的定义有 public$abc; private$abc(私有变量): protect $abc(受保护的变量): 下面是用实例来解释一下class <?php class test_123 { public $a; public $b; function squar() { return $this->a*$this->b; //这里求的是矩形的面积,由于class中定义的都是抽象的,所以这里需要把a.b

PHP中oop面向对象基础知识(一)

                                                                                    OOP 基础知识汇总(一) >>>你需要了解以下概念面向对象&面向过程概念:  面向过程:专注于解决一个问题的过程.面向过程的最大特点,是由一个一个的函数去解决处理这个问题的一系列过程.  面向对象:专注于由哪个对象来处理一个问题.面向对象的最大特点,是有一个个具有属性和功能的类,从类中拿到对象,进而处理问题. [

JavaScript 随笔2 面向对象 原型链 继承

第六章 面向对象的程序设计 1.创建对象的几种方式 A)工厂模式 function CreatObj(name,sex,age){ this.name=name; this.sex=sex; this.age=age; } 缺点:虽然可以批量创建对象,却不能知道对象的类型 只知道他是Object类型: B)构造函数 function Person(name,sex){ this.name=name; this.sex=sex; this.sayName=function(){ alert(thi

Javascript高级程序设计——面向对象之实现继承

原型链: 构造函数中都有一个prototype属性指针,这个指针指向原型对象,而创建的实例也有指向这个原型对象的指针__proto__.当实例查找方法时先在实例上找,找不到再通过__proto__到原型对象上查找.如果原型对象是另一个类型的实例,那么原型对象包含一个指向另一个原型对象的指针.另一个原型对象中也包含指向另一个构造函数的指针. 原型连继承function superValue(){ this.superValue = "superValue"; } superValue.p

如何理解并学习javascript中的面向对象(OOP) [转]

如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript面向对象,否则你无法更灵活的使用javascript这门语言. 什么事闭包?到底什么是原型?(知道闭包和原型的,就算得上是javascript的高手了.但真正能够理解,并且灵活运用的人并不多)到底该如何学习javascript中的面向对象呢?在javascript这么语言正如日中天,相信不少人正在为

javascript中的面向对象(object-oriented)编程

本文原发于我的个人博客,经多次修改放到csdn上,主要是做备份用,为了更好的阅读体验,请到我的个人博客上阅读. 最近工作一直在用nodejs做开发,有了nodejs,前端.后端.脚本全都可以用javascript搞定,很是方便.但是javascript的很多语法,比如对象,就和我们常用的面向对象的编程语言不同:看某个javascript开源项目,也经常会看到使用this关键字,而这个this关键字在javascript中因上下文不同而意义不同:还有让人奇怪的原型链.这些零零碎碎的东西加起来就很容

前端开发:面向对象与javascript中的面向对象实现(一)

前端开发:面向对象与javascript中的面向对象实现(一) 前言: 人生在世,这找不到对象是万万不行的.咱们生活中,找不到对象要挨骂,代码里也一样.朋友问我说:“嘿,在干嘛呢......”,我:“找不到对象!”,他:“就你那样也能找得到对象?”.我一脸黑线...... 废话不多说,今天博主要跟大家聊的是<面向对象与javascript中的面向对象实现>”. 面向对象理解: 面向对象是一种对现实世界理解和抽象的方法,是一种先进的程序设计理念,是一种比较抽象的,多形态的设计模式.我们可以这么理

JavaScript强化教程——Cocos2d-JS中JavaScript继承

JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-JS的早期版本Cocos2d-HTML中几乎全部的API都是模拟Cocos2d-x API而设计的,Cocos2d-x本身是有C++编写的,其中的很多对象和函数比较复杂,JavaScript语言描述起来有些力不从心了.在开源社区中John Resiq在他的博客(http://e