十四、JavaScript面向?qū)ο?/h2>
學(xué)習(xí)目標(biāo)

對(duì)象是從我們現(xiàn)實(shí)生活中抽象出來(lái)的一個(gè)概念,俗話(huà)說(shuō)物以類(lèi)聚,人以群分,我們也經(jīng)常說(shuō)有一類(lèi)人,他們專(zhuān)業(yè)給隔壁家制造驚喜,也就是我們說(shuō)的老王。

這里面就有兩個(gè)重要概念

類(lèi):無(wú)論是物以類(lèi)聚,還是有一類(lèi)人,這里說(shuō)的類(lèi)并不是實(shí)際存在的事物,是一些特征、是一些規(guī)則等。
老王:這是個(gè)實(shí)物,是現(xiàn)實(shí)存在,和類(lèi)的關(guān)系就是符合類(lèi)的描述
對(duì)應(yīng)到計(jì)算機(jī)術(shù)語(yǔ),類(lèi)就是class,定義了一些特點(diǎn)(屬性 property)和行為(方法 method),比如說(shuō)給隔壁制造驚喜的這類(lèi)人有幾個(gè)特征:
長(zhǎng)相文質(zhì)彬彬,為人和善;
姓王;
同時(shí)這些人還有技能(行為):

幫隔壁修下水道;
親切問(wèn)候?qū)Ψ絻鹤樱?br> 符合這些特點(diǎn)并且有上述行為能力的,我們稱(chēng)之為老王。從描述我們就可以看出來(lái)LaoWang不是指某個(gè)人,而是指一類(lèi)人,符合上述描述的都可能是老王!用計(jì)算機(jī)術(shù)語(yǔ)說(shuō)就是沒(méi)個(gè)活蹦亂跳的老王都是類(lèi)LaoWang。

一、創(chuàng)建對(duì)象

創(chuàng)建方式
1、使用new方式,使用typeof可以查看數(shù)據(jù)類(lèi)型。

    //創(chuàng)建person對(duì)象

    var person = new Object();
    //查看數(shù)據(jù)類(lèi)型
    console.log(typeof person);

查看數(shù)據(jù)類(lèi)型

2、使用{}方式

    //創(chuàng)建person對(duì)象
    var person = {};


    // 創(chuàng)建對(duì)象
    var person = {
        name: "3D brother",
        age: 81,

        show: function () {
            console.log(this.name, this.age);
        }
    };
    
    //給person對(duì)象添加gender(性別)屬性
    person.gender = "man";

3、構(gòu)造函數(shù)
構(gòu)造函數(shù)調(diào)用時(shí)和普通函數(shù)不同,需要新建一個(gè)對(duì)象,然后才能調(diào)用,此特性需要注意。

    // 創(chuàng)建Perosn的構(gòu)造函數(shù)
    function Person(name, age) {
        // 設(shè)置屬性
        this.name = name;
        this.age = age;
        // 設(shè)置方法
        this.show  = function () {
            console.log(this.name, this.age);
        };
    }


    // 使用構(gòu)造函數(shù)創(chuàng)建對(duì)象
    var person2 = new Person("laowang", 20);
    //使用Person的name屬性
    console.log(person2.name);
    // 用show()方法展示
    person2.show();

此方法將直接創(chuàng)建perosn對(duì)象,并直接在里面添加屬性和方法。
4、工廠設(shè)計(jì)模式
所謂工廠設(shè)計(jì)模式,即在構(gòu)造函數(shù)內(nèi)新建一個(gè)對(duì)象,然后給對(duì)象添加屬性和方法,然后按指定屬性和方法返回一個(gè)新建對(duì)象。它調(diào)用方法和普通函數(shù)類(lèi)似。

    // 工廠設(shè)計(jì)模式
    function people(name, age) {
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.show = function () {
            console.log(this.name, this.age);
        };
        return obj;
    }

    //工廠設(shè)計(jì)模式和構(gòu)造函數(shù)的區(qū)別就在于new關(guān)鍵字
    var p = new Person("name", 17);    // 構(gòu)造函數(shù)調(diào)用需要新建對(duì)象
    var p2 = people("name", 19);

添加屬性/函數(shù)(即方法,類(lèi)似于數(shù)組中的arr.length)
注意對(duì)象和JSON的區(qū)別。
添加方式:

1、. 的方式添加屬性

    //創(chuàng)建person對(duì)象
    var person1 = new Object(); 

    // var person2 = {};

    // 給person對(duì)象添加屬性
    person1.name = 'laowang';
    person1.gender = 'men';
    person1.age = '20';

    console.log(person);

控制臺(tái)打印效果

Object即為對(duì)象,name(姓名),gender(性別),age(年齡),即為person對(duì)象的屬性。
2、添加函數(shù)(即添加方法)

    //創(chuàng)建person對(duì)象

    var person = new Object();


    // 給person對(duì)象添加屬性
    person.name = 'laowang';
    person.gender = 'men';
    person.age = '20';


    // 給對(duì)象添加函數(shù)(方法),類(lèi)似于數(shù)組中arr.length
    person.sayHello = function () {
        // 在函數(shù)內(nèi)部可以使用this,誰(shuí)調(diào)用這個(gè)函數(shù),this就代表誰(shuí)
        console.log(this.name,this.gender,this.age);
    }
    person.sayHello();

控制臺(tái)打印效果

由上面代碼可以看出我們給person對(duì)象添加sayHello()方法,然后利用此方法就可以直接打印出隔壁老王的姓名、性別和年齡。
3、原型鏈的方式

二、JS的原型鏈

Js所有的函數(shù)都有一個(gè)prototype屬性,這個(gè)屬性引用了一個(gè)對(duì)象,即原型對(duì)象,也簡(jiǎn)稱(chēng)原型。這個(gè)函數(shù)包括構(gòu)造函數(shù)和普通函數(shù),我們講的更多是構(gòu)造函數(shù)的原型,但是也不能否定普通函數(shù)也有原型。所謂原型鏈,即原型所有的屬性,其下所有子‘類(lèi)’也具有相同屬性,由此往下繼承即為原型鏈。
作用:可以給‘類(lèi)’添加屬性和方法
1、Array.prototype.index = 10;
2、Array.prototype.show = function () {};

    // 構(gòu)造函數(shù)
    function Person(name, age) {
        this.name = name;
        this.age = age;
        this.show = function () {
            console.log(this.name, this.age);
        }
    }
    // 創(chuàng)建對(duì)象
    var p = new Person('2d', 12);

    // Person.prototype拿到原型,給原型設(shè)置屬性
    Person.prototype.gender = "haha";
    // 拿到Object原型,設(shè)置屬性,所有人都有index屬性
    Object.prototype.index = 1345;
    // 拿到Object原型,設(shè)置屬性,也可以添加方法show(),誰(shuí)調(diào)用就打印誰(shuí)。
    Object.prototype.show = function () {
        console.log(this);
    };
    
    console.log(p.gender);
    console.log(p.index);

    // 用Object的show()方法打印flag和數(shù)組
    var flag = true;
    flag.show();

    var arr = [24, 24];
    arr.show();
控制臺(tái)打印效果

三、繼承

讓一個(gè)‘類(lèi)’擁有另一個(gè)‘類(lèi)’的屬性和方法。
此處有三點(diǎn)需要注意:
1、call()和apply()方法的用法
語(yǔ)法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
apply方法:
語(yǔ)法:apply([thisObj ,arguments)
定義:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
call, apply方法都是用于改變this的指向。區(qū)別是,從第二個(gè)參數(shù)起, call方法參數(shù)將依次傳遞給借用的方法作參數(shù), 而apply直接將這些參數(shù)放到一個(gè)數(shù)組中再傳遞, 最后借用方法的參數(shù)列表是一樣的.

    // 構(gòu)造函數(shù)
    function Person (name,age) {
        this.name = name;
        this.age = age;

        this.show = function () {
            console.log(this.name,this.age);
        };
    };

    //讓student繼承Person
    function Student(name,age,major) {
        // 讓this調(diào)用Person構(gòu)造函數(shù),name/age作為參數(shù)傳遞;
        // Person.call(this,name,age);
        Person.apply(this,arguments);

        // 處理自己特殊的屬性和方法
        this.major = major;
        this.show = function () {
            console.log(this.name,this.age,this.major);
        };
    }

    // 新建Student對(duì)象,傳遞參數(shù)
    var stu = new Student('laowang',19,'PS');

    console.log(stu.name,stu.age,stu.major);

    stu.show();

上述代碼中person對(duì)象的屬性,我們可以通過(guò)call()或者apply()方法改變this的指向,使Stuend對(duì)象來(lái)繼承person的屬性。

控制臺(tái)打印效果

2、方法調(diào)用的順序
我們構(gòu)造一個(gè)函數(shù),然后給它的原型添加屬性,它的子類(lèi)會(huì)繼承它本身的屬性而不會(huì),繼承它原型的屬性;如果一定要子類(lèi)繼承它原型的屬性必須把父類(lèi)的原型賦給子類(lèi)的原型。

    // 構(gòu)造函數(shù)Person
    function Person(name, age){
        this.name = name;
        this.age = age;

        this.show = function () {
            console.log(this.name, this.age);
        }
    }

    // 給Person的原型添加gender屬性
    Person.prototype.gender = "man";

    // 構(gòu)造函數(shù)
    function Student(name, age, major) {
        // 讓Student繼承Person的屬性,將所有參數(shù)作為集合進(jìn)行傳遞
        Person.apply(this,arguments)
        // 處理自己特殊的屬性和方法
        this.major = major;
        this.show = function () {
            console.log(this.name, this.age, this.major);
        }
    }

    
    // 將Person的原型賦給Student的原型
    Student.prototype = Person.prototype;


    // 調(diào)用Person的屬性
    var p = new Person('laowang',20);
    console.log(p.gender);


    // 調(diào)用Student的屬性
    var student = new Student('xiaoming', 18, 'CAD');
    student.show()
    // 如果未將父級(jí)的原型賦給子級(jí)的原型此處將是undefined
    console.log(student.gender);

上述代碼中我們構(gòu)造Person函數(shù)后,給它的原型添加gender(性別)屬性,它的子級(jí)Student雖然繼承了它的所有屬性,但是卻沒(méi)有繼承g(shù)ender屬性,為了使Student繼承g(shù)ender屬性,我們需要把Person的原型賦給Student的原型,代碼執(zhí)行效果如下:


代碼執(zhí)行效果

當(dāng)父類(lèi)的原型、父類(lèi)、子類(lèi)的原型和子類(lèi)都具有一個(gè)相同的屬性時(shí),優(yōu)先調(diào)用子類(lèi)的屬性;調(diào)用屬性是如果子類(lèi)沒(méi)有該屬性,會(huì)從其父類(lèi)中查找,如果父類(lèi)沒(méi)有,就從子類(lèi)的原型中查找,如果子類(lèi)的原型中也沒(méi)有就從父類(lèi)的原型中調(diào)用,如果父類(lèi)的原型中也沒(méi)有(注意:要從父類(lèi)的原型中查找首先要將父類(lèi)的原型賦給子類(lèi)的原型),就從Object中查找。

    // 給Object的原型添加方法
    Object.prototype.show = function () {
        console.log("Object");
    }

    function Obj1(){
        this.show = function () {
            console.log('Obj1');
        }
    }

    // 給Obj1的原型添加show()方法
    Obj1.prototype.show = function () {
        console.log('prototype.Obj1')
    }


    function Obj2() {
        // 讓Obj2繼承Obj1的屬性
        Obj1.apply(this,arguments)

        this.show = function () {
            console.log('Obj2');
        }
    }

    // 將Obj1的原型賦給Obj2的原型
    Obj2.prototype = Obj1.prototype;


    // 給Obj2的原型添加show()方法
    Obj2.prototype.show = function () {
        console.log('prototype.Obj2');
    }

    // 調(diào)用Obj2的屬性
    var Obj2 = new Obj2();
    Obj2.show()

上面的代碼我們可以看出Object、Obj1、Obj1.prototype、Obj2、Obj2.prototype都擁有show()方法,我們使Obj2繼承Obj1的所有屬性,并且將Obj1的原型賦給Obj2的原型,然后我們新建一個(gè)對(duì)象調(diào)用show()方法。那么問(wèn)題來(lái)了,它到底會(huì)調(diào)用誰(shuí)的方法呢?首先肯定是調(diào)用Obj2的方法,但是當(dāng)我們把Obj2的方法注釋掉的時(shí)候它會(huì)調(diào)用誰(shuí)的呢,通過(guò)執(zhí)行代碼我們會(huì)發(fā)先,它執(zhí)行的是Obj1的方法,如果我們?cè)侔袿bj1的方法注釋掉的時(shí)候它又會(huì)調(diào)用誰(shuí)的呢?通過(guò)執(zhí)行代碼我們會(huì)發(fā)現(xiàn)show()方法調(diào)用的順序是,先從Obj2開(kāi)始,依次是Obj1,Obj2的原型,Obj1的原型,Object。
為避免發(fā)生以上問(wèn)題,我們?cè)诿麑傩悦麜r(shí)應(yīng)盡可能地避免屬性名重復(fù)。

3、原型賦值會(huì)進(jìn)行完全覆蓋覆蓋
如果將父類(lèi)的原型賦值給子類(lèi)的原型會(huì)發(fā)生,完全覆蓋,如果想避免覆蓋可以用for/in循環(huán)遍歷父類(lèi)的原型,來(lái)逐個(gè)添加。

    // 構(gòu)造函數(shù)Person
    function Person(name, age){
        this.name = name;
        this.age = age;

        this.show = function () {
            console.log(this.name, this.age);
        }
    }


    // 給Person的原型添加gender屬性
    Person.prototype.gender = "man";

    // 構(gòu)造函數(shù)
    function Student(name, age, major) {
        // 讓Student繼承Person的屬性,將所有參數(shù)作為集合進(jìn)行傳遞
        Person.apply(this,arguments)
        // 處理自己特殊的屬性和方法
        this.major = major;
        this.show = function () {
            console.log(this.name, this.age, this.major);
        }
    }


    // 給Student的原型添加height(身高)屬性
    Student.prototype.height = 180;

    // 將Person的原型賦給Student的原型
    // Student.prototype = Person.prototype;

    // 循環(huán)遍歷Person的原型將其屬性逐個(gè)賦給Student的原型
    for ( key in Person.prototype) {
        Student.prototype[key] = Person.prototype[key]
    }


    // 調(diào)用Student的屬性
    var student = new Student('xiaoming', 18, 'CAD');

    console.log(student.height);

上述帶碼中我們先給Person的原型添加了gender屬性,之后又給Student的原型添加了height屬性,為了使Student也能繼承g(shù)ender的屬性,我們將Person的原型賦給Student的原型。那么問(wèn)題來(lái)了,此時(shí)我們?cè)僬{(diào)用height屬性時(shí),顯示的是undefined,為什么會(huì)發(fā)生這種情況呢?就是因?yàn)镻erson的原型將Student的原型完全覆蓋了,想要解決這個(gè)問(wèn)題很顯然我們只需要改變一下代碼順序即可,但是如果我們就想要代碼這么排列怎么辦呢?此時(shí)我們就需要用到for/in循環(huán),遍歷Person的原型中的所有屬性依次給Student的原型賦值即可解決完全覆蓋的問(wèn)題。代碼執(zhí)行效果如下:


代碼執(zhí)行效果

四、給原始對(duì)象添加方法

1、Array
給數(shù)組添加addOne()方法,讓所有調(diào)用此方法的數(shù)組中所有的元素全部加1。


    // 給數(shù)組添加方法addOne()讓數(shù)組中所有的元素全部加1

    // 第一步:給數(shù)組原型添加方法
    Array.prototype.addOne = function () {
        // 第二步:聲明數(shù)組,遍歷數(shù)組中的元素
        var newArray = [];
        for (var i = 0; i < this.length; i++) {
            newArray[i] = this[i] + 1;
        }
        // 第三步:返回新數(shù)組
        return newArray;
    };

    var array = [134, 456, 89, 234, 568, 76543, 45678];

    var newArray = array.addOne();
    
    console.log(array);
    console.log(newArray);



    var age = [12, 34, 26, 78, 12];
    var newAge = age.addOne();
    console.log(age);
    console.log(newAge);

    // 給數(shù)組添加show()方法,調(diào)用此方法是打印該數(shù)組
    Array.prototype.show = function () {
        console.log(this);
    };
    age.show();
    newAge.show();

控制臺(tái)打印效果

2、String
給字符串添加trim()方法,使所有調(diào)用此方法的字符串,去掉首尾空格,中間多個(gè)空格改為一個(gè)空格。


    // trim()首尾空格去掉,中間多個(gè)空格改為一個(gè)空格

    //第一步:給string原型添加方法
    String.prototype.trim = function () {
        // 第二步:采用正則表達(dá)式進(jìn)行替換
        var res = this.replace(/^\s+|\s+$/g, "");
        res = res.replace(/\s+/g, " ");
        // 返回替換的值
        return res;
    }

    var str = ' hsskfhsfu   ewe  eworew  ';
    var res = str.trim();
    
    console.log("(" + str + ")");
    console.log('('+res+')');

控制臺(tái)打印效果

3、Date
給日期添加方法getWeek()獲取當(dāng)天是星期幾。

    // 給日期添加方法getWeek()獲取當(dāng)天是星期幾

    // 第一步:給Date原型添加方法
    Date.prototype.getWeek = function () {
        // 第二步:聲明數(shù)組,保存所有結(jié)果
        var array = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六' ]

        // 第三步:獲取星期幾的數(shù)字
        var index = this.getDay();

        // 第四步:根據(jù)星期幾從數(shù)組中取出內(nèi)容,并返回
        return array[index]

    }

    var nowDate = new Date();

    var res = nowDate.getWeek();

    console.log(res);
控制臺(tái)打印效果

五、instanceof

作用:判斷某個(gè)對(duì)象是不是屬于某個(gè)‘類(lèi)’。

使用方法

    var arr = new Array();
    var arr2 = [];

    console.log(arr instanceof Array); // true
    console.log(arr2 instanceof Array); // true

    var str = new String();
    var str2 = "";

    console.log(str instanceof String); // true
    console.log(str2 instanceof String); // false

    function Person() {

    }
    var p = new Person();
    console.log(p instanceof Person); // true
    console.log(p instanceof Object); // true


    console.log(Array instanceof Array); // false
    console.log(String instanceof String); // false
    console.log(Object instanceof Object); // true

    console.log(Array instanceof Object); // true

    var a = new Array;
    console.log(a);
控制臺(tái)打印效果

六、對(duì)象的克隆

1、類(lèi)型:值類(lèi)型、引用類(lèi)型。
值類(lèi)型:string(字符串),number(數(shù)字),boolean(布爾值)
引用類(lèi)型:Array(數(shù)組),JSON,Object(對(duì)象),Date(時(shí)間日期對(duì)象)………

2、克隆引用類(lèi)型

原理:

轉(zhuǎn)為JSON字符串: var jsonStr = JSON.stringify(obj);
再?gòu)腏SON字符串轉(zhuǎn)化為對(duì)象: var obj = JSON.parse(jsonStr);


    var a = 10;
    var b = a;
    b = 13456;
    console.log(a);

    var arr = [134, 45];
    var arr2 = arr;
    arr2[0] = 1234567890;
    console.log(arr);
控制臺(tái)打印結(jié)果

從上面的代碼可以看出當(dāng)我們把a(bǔ)賦給b時(shí),我們改變變量b的值時(shí),變量a的值不會(huì)發(fā)生變化;當(dāng)我們用arr給arr2賦值時(shí),當(dāng)我們改變arr2的第一個(gè)元素的值時(shí),數(shù)組arr的值也會(huì)隨之發(fā)生改變。以下代碼便可幫我們復(fù)制元素。

    Object.prototype.copy = function () {

        // console.log(this instanceof Array);
        // 判斷是否是數(shù)組
        if (Array.isArray(this)) {
            var jsonStr = JSON.stringify(this);
            return JSON.parse(jsonStr);
        } else { // other
            // 創(chuàng)建新對(duì)象
            var newObj = new Object();
            // 把this中的每個(gè)屬性和方法都賦值到新對(duì)象中
            for (key in this) {
                newObj[key] = this[key];
            }
            return newObj;
        }
    };


    var arr = [134, 4567, 678];
    var newArr = arr.copy();
    // newArr[0] = 1000;
    // console.log(arr);
    // console.log(newArr);

    var person1 = {
        name: "haha",
        age: 18,
        test: function () {
            console.log(this.age);
        }
    };
    var newPerson = person1.copy();
    newPerson.name = "heheheh";
    newPerson.age = 19;

    console.log(person1);
    console.log(newPerson);

    person1.test();
    newPerson.test();

七、制作JQ插件

此處主要是給JQ原型或者$添加屬性,因此需要用到以下兩個(gè)屬性:
$.extend({
funcName: function () {
}
}); 拓展給$

$.fn.extend({
funcName: function () {
}
}); 拓展給JQ

一般建議給JQ添加。

1、封裝圖片放大效果:
我們要做圖片放大插件的效果就是,用戶(hù)下載好插件的文件后,只需引入JQ和我們做好插件,并在html中放一張圖片,然后在js中獲取圖片調(diào)用一個(gè)方法,再提供一大一小兩張相同圖片的路徑作為參數(shù)即可實(shí)現(xiàn),圖片放大效果。

首先我們寫(xiě)一個(gè)模板做好html布局代碼如下:

    <body>
        <div class="min-wrap">
            <img src="images/min.jpg" alt="" />
            <div id="slider"></div>
        </div>
        <div class="max-wrap">
            <img src="images/max.jpg" alt="" />
        </div>

    </body>

布局完成后設(shè)置css樣式,并將其單獨(dú)存放在一個(gè)css文件中:

.min-wrap {
    border: 1px solid black;
    position: relative;
    width: 300px;
    left: 10px;
    top: 20px;
}
.min-wrap img {
    width: 100%;
}
#slider {
    background: url(images/dian.png);
    width: 150px;
    height: 150px;
    position: absolute;
    left: 0;
    top: 0;
    display: none;
}

.max-wrap {
    border: 1px solid black;
    width: 400px;
    height: 400px;
    overflow: hidden;
    position: absolute;
    left: 330px;
    top: 20px;
    display: none;
}

然后我們開(kāi)始寫(xiě)JS文件,我們要先獲取head標(biāo)簽,在其中插入link標(biāo)簽引入我們寫(xiě)好的css文件,然后將我們寫(xiě)好的結(jié)構(gòu)插入到用戶(hù)提供的img標(biāo)簽后,使用我們寫(xiě)好的結(jié)構(gòu)和樣式,如此布局就算完成,之后我們按正常實(shí)現(xiàn)圖片放大的效果寫(xiě)JS代碼即可。

$.fn.extend({
    fang: function (minImgPath, maxImgPath) {

        // 引入樣式文件
        $('head').eq(0).append('<link rel="stylesheet" href="fang.css">');

        // 新結(jié)構(gòu)
        var htmlStr = $('<div class="min-wrap">' +
                            '<img src="'+ minImgPath +'" alt="" />' +
                            '<div id="slider"></div>' +
                        '</div>' +
                        '<div class="max-wrap">' +
                            '<img src="'+ maxImgPath +'" alt="" />' +
                        '</div>');
        // 拼接到image后面
        this.after(htmlStr);
        this.remove();

        // 獲取元素
        var minWrap = $('.min-wrap');
        var slider = $('#slider');
        var maxWrap = $('.max-wrap');
        var maxImg = $('.max-wrap img');

        // 綁定事件
        minWrap.on('mousemove', function (e) {
            slider.show();
            maxWrap.show();

            var x = e.clientX - minWrap.offset().left - slider.width() / 2;
            var y = e.clientY - minWrap.offset().top - slider.height() / 2;

            // 判斷臨界值
            if (x < 0) {
                x = 0;
            } else if (x > minWrap.width() - slider.width()) {
                x = minWrap.width() - slider.width();
            }
            if (y < 0) {
                y = 0;
            } else if (y > minWrap.height() - slider.height()) {
                y = minWrap.height() - slider.height();
            }

            // 移動(dòng)slider
            slider.css({
                left: x + "px",
                top: y + "px"
            });

            // 修改maxWrap的滾動(dòng)
            var scale = {
                x: x / (minWrap.width() - slider.width()),
                y: y / (minWrap.height() - slider.height())
            };
            var maxWrapLeft = (maxImg.width() - maxWrap.width()) * scale.x;
            var maxWrapTop = (maxImg.height() - maxWrap.height()) * scale.y;

            maxWrap.scrollLeft(maxWrapLeft);
            maxWrap.scrollTop(maxWrapTop);
        });
        minWrap.on('mouseout', function () {
            slider.hide();
            maxWrap.hide();
        });
    }
});

用戶(hù)使用的時(shí)候只需引入JQuery和我們寫(xiě)好的JS文件,然后使用fang()方法將大小兩張圖片的路徑做為參數(shù),即可實(shí)現(xiàn)效果。

HTML代碼
插件效果

八、練習(xí)

1、Tab切換


效果圖
原生JS版代碼

普通版Tap切換

    // 普通版Tap切換
    var inputs = document.getElementsByTagName('input');
    var show = document.getElementsByClassName("show");

    for (var i = 0; i < inputs.length; i++) {
        inputs[i].index = i;
        inputs[i].onclick = function () {
            for (var j = 0; j < inputs.length; j++) {
                show[j].style.display = 'none';
            }
            show[this.index].style.display = 'block';
        }
    }

面向?qū)ο蟀?/p>


    // 面向?qū)ο蟀郥ab切換

    // 構(gòu)造函數(shù)
    function Tap () {
        // 聲明變量保存所有的div和input
        this.inputs = document.getElementsByTagName("input");
        this.divs = document.getElementsByClassName("show");

        // 聲明變量保存this
        var mythis = this;
        // 遍歷所有按鈕
        for (var i = 0; i < this.inputs.length; i++) {
            // 自定義按鈕下標(biāo)
            this.inputs[i].index = i;
            // 為所有按鈕綁定事件
            this.inputs[i].onclick = function () {
                // 讓Tab對(duì)象調(diào)用原型的方法將this作為參數(shù)進(jìn)行傳遞
                mythis.click(this)
            }
        }

    }

    // 為T(mén)ab的原型添加方法
    Tap.prototype.click = function (obj) {
        for (var i = 0; i < this.inputs.length; i++) {
            this.divs[i].style.display = 'none';
        }
        this.divs[obj.index].style.display = 'block';
    }
    // 調(diào)用函數(shù)
    var tab = new Tap();
JQuery版代碼

普通版tab切換

    // 普通版tab切換

    $('input').click(function () {
        $('.show').hide()
        $('.show').eq($(this).index()).show()
    })

面向?qū)ο蟀?/p>

    // 面向?qū)ο蟀郥ab切換

    
    // 構(gòu)造函數(shù)
    function Tab() {
        // 聲明兩個(gè)屬性,保存所有的input和div
        this.inputs = $('input');
        this.divs = $('.show');
        // 使第一個(gè)div處于顯示的狀態(tài)
        this.divs.eq(0).show();

        // 使用變量保存對(duì)象的this
        var mythis = this;
        // 給所有的按鈕綁定事件,點(diǎn)擊按鈕時(shí)使對(duì)象調(diào)用原型的方法
        this.inputs.click(function () {
            mythis.myclick(this)
        })
    }

    // 給Tab的原型添加方法
    Tab.prototype.myclick = function (obj) {
        this.divs.hide();
        this.divs.eq($(obj).index()).show();
    }

    var tab = new Tab();

2、躁動(dòng)的小球

代碼效果

原生JS普通版

    // 獲取元素
    var box = document.getElementsByClassName('box')[0];

    // 聲明函數(shù),生成隨機(jī)整數(shù)
    var randomFun = function (max, min) {
        return parseInt(Math.random()*(max - min + 1) + min);
    }
    // 聲明函數(shù)設(shè)置隨機(jī)顏色
    var colorFun = function () {
        return 'rgba('+ randomFun(255,0) +','+ randomFun(255,0) +',' + randomFun(255,0)+ ',' + (Math.random() + 0.1) + ')';
    }

    // 循環(huán)創(chuàng)建小球
    for (var i = 0; i < 500; i++) {
        // 聲明變量設(shè)置小球?qū)捀?        var w = randomFun(80, 20);
        // 聲明變量接收臨界值
        var maxY = document.body.offsetHeight - w;
        var maxX = document.body.offsetWidth - w;
        // 聲明變量設(shè)置小球位置
        var x = randomFun(maxX, 0);
        var y = randomFun(maxY, 0);
        // 創(chuàng)建小球并設(shè)置顏色
        var ball = document.createElement("div");
        ball.id = 'ball';
        ball.style.top = y + 'px';
        ball.style.left = x + 'px';
        ball.style.width = w + 'px';
        ball.style.height = w + 'px';
        ball.style.backgroundColor = colorFun();
        box.appendChild(ball)
    }

面向?qū)ο蟀?/p>

// 一、獲取元素

        var box = document.getElementsByClassName('box')[0];

// 二、聲明函數(shù)生成隨機(jī)整數(shù),用于設(shè)置小球?qū)捀?,還有top和left值
        var randomFun = function (max, min) {
            return parseInt(Math.random()*(max - min + 1) + min);
        }

// 三、聲明函數(shù)設(shè)置隨機(jī)顏色
        var colorFun = function () {
            return 'rgba('+ randomFun(255,0) +','+ randomFun(255,0) +',' + randomFun(255,0)+ ',' + (Math.random() + 0.1) + ')';
        }

// 四、獲取屏幕的寬度和高度用于判斷top和left的臨界值

        var maxY = document.body.offsetHeight;
        var maxX = document.body.offsetWidth;

// 五、構(gòu)造函數(shù)為小球添加寬高、坐標(biāo)、顏色、父級(jí)等屬性,并設(shè)置方法。

        var Ball = function(x, y, h, w, color, parent) {
            // 聲明變量設(shè)置隨機(jī)寬度
            var wAndH = randomFun(80, 20);

            // 為構(gòu)造函數(shù)添加屬性,如果有參數(shù)返回參數(shù),否則返回隨機(jī)x坐標(biāo)。
            this.x = x || randomFun(maxX-wAndH,0);
            this.y = y || randomFun(maxY-wAndH,0);
            this.h = h || wAndH;
            this.w = w || wAndH;
            this.color = color || colorFun();
            this.parent = parent || box;
            this.ball = document.createElement("div");


            // 設(shè)置方法
            this.show = function () {
                this.ball.id = 'ball';
                this.ball.style.width = this.w + 'px';
                this.ball.style.height = this.h + 'px';
                this.ball.style.top = this.y + 'px';
                this.ball.style.left = this.x + 'px';
                this.ball.style.backgroundColor = this.color;
                this.parent.appendChild(this.ball);

            }

        }

// 六、循環(huán)創(chuàng)建對(duì)象,并調(diào)用該方法
        for (var i = 0; i < 500; i++) {
            var ball = new Ball();
            ball.show();
        }


以上內(nèi)容純屬個(gè)人理解,由于水平有限,若有錯(cuò)漏之處敬請(qǐng)指出斧正,小弟不勝感激。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容