• javascript面向对象


    1.Javascript面向对象的概念
    (1).一切事物皆对象
    (2).对象具有封装和继承特性
    (3).对象与对象之间使用消息通信,各自存在信息隐藏
    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为
    它的语法中没有class(类)
    2.基于类的面向对象和基于原型的面向对象方式比较
    在基于类的面向对象方式中,对象(object)依靠 类(class)来产生。而在基于原型的面向对象方式中,对象(object)则是依靠 构造器
    (constructor)利用 原型(prototype)构造出来的。举个客观世界的例子来说明二种方式认知的差异。例如工厂造一辆车,一方面,工人必须参照一
    张工程图纸,设计规定这辆车应该如何制造。这里的工程图纸就好比是语言中的 类 (class),而车就是按照这个 类(class)制造出来的;另一方面,工
    人和机器 ( 相当于 constructor) 利用各种零部件如发动机,轮胎,方向盘 ( 相当于 prototype 的各个属性 ) 将汽车构造出来。
    3. 面向对象的特点:
    封装、继承和多态。这里先详细说明这几个特点,后面几个部分分别在JavaScript中实现这些特点,从而实现完整的面向对象模拟。 ?
    封装:封装就是把各种方法和变量合并到一个类,用这个类代表某个对 象为完成一定的任务所能保存的范围以及它能执行的操作。封装隐藏了方法执行
    的细节。 ?
    继承:继承就是根据现有类的方法和成员变量生成新的类的功能。 ?
    多态:多态就是对象随着程序执行而使其形式发生改变的能力
    4.基本数据类型:
    Number, String, Boolean, Function, Object, Array, null, undefined
    注意null和undefined的区别。
    5.继承的实现
    (1).对象冒充法
    <script type="text/javascript" language="javascript">
    function classA(sColor){
    this.color=sColor;
    this.sayColor=function(){
    alert(this.color)
    }
    }
    function classB(sColor,sName){
    this.method=classA();// ClassA的构造函数成为ClassB的方法
    this.method=(sColor); // 使用ClassA的构造函数,ClassB会收到ClassA的构造函数中定义的属性和方法
    delete this.method; // 删除ClassA的引用
    this.name=sName;
    this.sayName=function(){
    alert(this.name)
    }
    }
    var obj= new ClassB("blue", "Nicholas");
    obj.sayColor();
    obj.sayName();
    alert(obj instanceof ClassA); // 返回false
    alert(obj instanceof ClassB); // 返回true
    </script>
    以上,ClassA为构造函数,其实也只是一个函数,所以ClassA的构造子数成为了ClassB的一个方法,然后调用该方法,在ClassB中引入了ClassA()构造
    函数中定义的属性和方法。最后删除对ClassA的引用。这样一来,相当于ClassA构造函数中定义的属性和方法成为了ClassB中定义的属性及方法。
    对于instanceof方法,在使用对象冒充继承时,如果使用instanceof <基类名>是返回false的。所以对象冒出继承是假继承法
    冒充方法只适合所有的属性及方法在构造函数中进行定义的类
    (2).call()和apply()方法
    ● call方法与经典的对象冒充方法最相似,它第一个参数用作this的对象,表示需要被继承的对象,其它参数都直接传递给基类构造函数的。
    <script type="text/javascript" language="javascript">
    function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function() { alert(this.color); };
    }
    function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(sColor);
    //delete this.newMethod;
    ClassA.call(this, sColor); // 很简便,一行相当于上面三行。
    this.name = sName;
    this.sayName = function () { alert(this.name); };
    }
    // 使用直接定义对象方法。从相应的对象中继承。
    function sayColor(sPrefix, sSuffix) {
    alert(sPrefix + this.color + sSuffix);
    }
    var obj = new Object();
    obj.color ="red";
    sayColor.call(obj, 'The color is ', ', a very nice color indeed.'); // 表示obj对象继承自sayColor.
    </script>
    ● apply方法有两个参数,分别为this对象(即需要被继承的对象)和要传递给基类构造函数参数的数组。例如:
    function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(sColor);
    //delete this.newMethod;
    ClassA.apply(this, new Array(sColor)); // 与call不同的是,第二个参数是一个参数数组.
    this.name = sName;
    this.sayName = function () { alert(this.name); };
    }
    3.原型链继承
    <script type="text/javascript">
    function ClassA(sColor) {
    this.color = sColor;
    }
    ClassA.prototype.sayColor = function() { alert(this.color); }; // 原型方法
    //如果需要继承ClassA中的原型方法,需要在子类中使用以下语句: ClassB.prototype = new ClassA();
    function ClassB(sColor, sName) {
    ClassA.call(this, sColor); // 继承了ClassA中的构造方法

    this.name = sName;
    this.sayName = function() { alert(this.name); };
    }
    ClassB.prototype = new ClassA(); // 继承了ClassB中的原型方法

    var objB = new ClassB("blue", "Nicholas");
    objB.sayColor();
    objB.sayName();
    alert(objB instanceof ClassA); // 返回true
    alert(objB instanceof ClassB); // 返回true
    </script>
    一般来说,在Javascript中,继承一个类,对象冒充及原型链方式都会被混合在一起使用。使用对象冒充继承构造函数的属性,使用原型链继承
    prototype对象的方法。

  • 相关阅读:
    Facelets应用程序的生命周期
    JavaServer Faces生命周期概述
    spring security使用自定义登录界面后,不能返回到之前的请求界面的问题
    记一次使用mybatis进行like 模糊查询遇到的问题
    用Filter作用户授权的例子
    p132代码解析
    xml
    java EE第一周博客
    spring security的简单应用
    Java包装类,以及Integer与int之间的比较
  • 原文地址:https://www.cnblogs.com/hym881013/p/4593136.html
Copyright © 2020-2023  润新知