国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS面向?qū)ο?

xumenger / 579人閱讀

摘要:什么是面向?qū)ο缶幊逃脤ο蟮乃枷肴懘a,就是面向?qū)ο缶幊踢^程式寫法面向?qū)ο髮懛ㄎ覀円恢倍荚谑褂脤ο髷?shù)組時間面向?qū)ο缶幊痰奶攸c抽象抓住核心問題封裝只能通過對象來訪問方法繼承從已有對象上繼承出新的對象多態(tài)多對象的不同形態(tài)對象的組成方法行為操作對

什么是面向?qū)ο缶幊?/b>

用對象的思想去寫代碼,就是面向?qū)ο缶幊?/p>

過程式寫法

面向?qū)ο髮懛?/p>

我們一直都在使用對象

數(shù)組Array 時間Date

面向?qū)ο缶幊蹋∣OP)的特點

抽象:抓住核心問題

封裝:只能通過對象來訪問方法

繼承:從已有對象上繼承出新的對象

多態(tài):多對象的不同形態(tài)

對象的組成

方法(行為、操作) —— 對象下面的函數(shù):過程、動態(tài)的

屬性 —— 對象下面的變量:狀態(tài)、靜態(tài)的

創(chuàng)建第一個面向?qū)ο蟪绦?/b>
//var obj = {};
var obj = new Object(); //創(chuàng)建了一個空的對象
obj.name = "小明"; //屬性
obj.showName = function(){ //方法
    alert(this.name);
}
obj.showName();

為對象添加屬性和方法

Object對象

this指向

創(chuàng)建兩個對象:重復(fù)代碼過多

//var obj = {};
var obj = new Object(); //創(chuàng)建了一個空的對象
obj.name = "小明"; //屬性
obj.showName = function(){ //方法
    alert(this.name);
}
obj.showName();
var obj2 = new Object(); 
obj2.name = "小強";
obj.showName = function(){
    alert(this.name);
}
obj2.showName();
工廠方式

面向?qū)ο笾械姆庋b函數(shù)

//工廠方式:封裝函數(shù)
function createPerson(name){
    //1. 原料
    var obj = new Object();  
    //2. 加工
    obj.name = name;
    obj.showName = function(){
        alert(this.name);
    };   
    //3. 出廠
    return obj;
}
var p1 = createPerson("小明");
p1.showName();
var p2 = createPerson("小強");
p2.showName();

改成與系統(tǒng)對象類似的寫法
1、首字母大寫
2、New關(guān)鍵字提取
3、this指向為新創(chuàng)建的對象

/* 當(dāng)new去調(diào)用一個函數(shù):這個時候函數(shù)中的this就是創(chuàng)建出來的對象,而且函數(shù)的返回值直接就是this啦。(這叫做隱式返回) */
// new后面調(diào)用的函數(shù):構(gòu)造函數(shù)
function CreatePerson(name){
    this.name = name;
    this.showName = function(){
        alert(this.name);
    };
    // return obj; 隱式返回,所以這一行不用寫了
}

var p1 = new CreatePerson("小明");
p1.showName();
var p2 = new CreatePerson("小強");
p2.showName();

構(gòu)造函數(shù)
用來創(chuàng)建對象的函數(shù),叫做構(gòu)造函數(shù)
存在的問題
1、對象的引用
2.浪費內(nèi)存

/* 當(dāng)new去調(diào)用一個函數(shù):這個時候函數(shù)中的this就是創(chuàng)建出來的對象,而且函數(shù)的返回值直接就是this啦。(這叫做隱式返回) */

// new后面調(diào)用的函數(shù):構(gòu)造函數(shù)
function CreatePerson(name){
    this.name = name;
    this.showName = function(){
        alert(this.name);
    };
    // return obj; 隱式返回,所以這一行不用寫了
}
var p1 = new CreatePerson("小明");
p1.showName();
var p2 = new CreatePerson("小強");
p2.showName();

//alert(p1.showName == p2.showName); //false
/*
    var a = [1, 2, 3];
    var b = [1, 2, 3];

    alert(a == b); //false;
*/

/*
    var a = 5;
    var b = a;
    b += a;
    alert(b); //8
    alert(a); //5 基本類型:賦值的時候只是值的復(fù)制
*/

/*
    var a = [1, 2, 3]; 
    var b = a; 
    b.push(4);
    alert(b); //[1, 2, 3, 4]
    alert(a); //[1, 2, 3, 4] 對象類型:賦值不僅是值的復(fù)制,而且也是引用的傳遞
*/

/*
    var a = [1, 2, 3];
    var b = a;
    b = [1, 2, 3, 4];
    alert(b); //[1, 2, 3, 4]
    alert(a); //[1, 2, 3] 只要賦值就會在內(nèi)存中重新生成,所以a,b互補影響
*/

/*
    var a = 5;
    var b = 5;
    alert(a == b); //true 基本類型的比較:只要值相同就可以
*/

/*
    var a = [1, 2, 3];
    var b = [1, 2, 3];
    alert(a == b); //false 對象類型:值和引用都相同才行
*/

/*
    var a = [1, 2, 3];
    var b = a;
    alert(a == b); //true
*/
原型 —— prototype

概念
去改寫對象下面公用的方法或者屬性,讓公用的方法或者屬性在內(nèi)存中僅存在一份(好處:提高性能)

學(xué)習(xí)原型

類比:原型就是CSS中的class(普通方法就是CSS中的style)

普通方法的優(yōu)先級比原型要高

原型可以復(fù)用,普通方法不可以復(fù)用

var arr = []; 
arr.number = 10;
Array.prototype.number = 20;
alert(arr.number); //10 普通方法的優(yōu)先級高于原型
//原型:prototype:要寫在構(gòu)造函數(shù)下面
var arr = [1, 2, 3, 4, 5];
var arr2 = [2, 2, 2, 2, 2];
Array.prototype.sum = function(){
    var result = 0;
    for(var i=0; i

通過原型改寫工廠方式原則:

相同的屬性和方法可以加在原型上

混合的編程模式

function CreatePerson(name){
    this.name = name; //變化的,不能公用的屬性不能寫在原型上
}
CreatePerson.prototype.showName = function(){
    alert(this.name);
}   

var p1 = new CreatePerson("小明");
var p2 = new CreatePerson("小強");

alert(p1.showName == p2.showName); //true

混合的編程模式

//面向?qū)ο蟮膶懛?function 構(gòu)造函數(shù)(){
    this.屬性
}
構(gòu)造函數(shù).原型.方法 = function(){};

//面向?qū)ο蟮氖褂?var 對象1 = new 構(gòu)造函數(shù)();
對象1.方法();

總結(jié)面向?qū)ο髮懛?構(gòu)造函數(shù)加屬性,原型加方法

面向?qū)ο蟮倪x項卡

原則
先寫出普通的寫法,然后改成面向?qū)ο髮懛?/p>

普通方法變型

盡量不要出現(xiàn)函數(shù)嵌套函數(shù)

可以有全局變量

把onload中不是賦值的語句放到多帶帶的函數(shù)中

改成面向?qū)ο?/p>

全局變量就是屬性

函數(shù)就是方法

onload中創(chuàng)建對象

改this指向問題,要盡量讓面向?qū)ο笾械膖his指向?qū)ο?/p>

1、先寫出普通方法




    
    面向?qū)ο蟮倪x項卡
    
    


    
11111
22222
33333

2、普通方法變型




    
    面向?qū)ο蟮倪x項卡
    
    


    
11111
22222
33333

關(guān)于this的指向

oDiv.onclick = function(){
    this: oDiv
};

---

oDiv.onclick = show;
function show(){
    this: oDiv
}

---

oDiv.onclick = function(){
    show();
};
function show(){
    this: window
}

改寫成面向?qū)ο?/strong>




    
    面向?qū)ο骲ianxie
    
    


    
11111
22222
33333

面向?qū)ο蟮膹?fù)用




    
    面向?qū)ο骲ianxie
    
    


    
11111
22222
33333
11111
22222
33333
面向?qū)ο蟮耐献?/b>

注意

Event對象(event對象一定要寫到事件函數(shù)里面)

事件函數(shù)中用來阻止默認(rèn)行為的return false也要寫到事件函數(shù)里面

!DOCTYPE html>


    
    面向?qū)ο缶帉懲献?/title>
    <style>
        #div1 { width: 100px; height: 100px; background: red; position: absolute; }
    </style>
    <script>

    /* 普通拖拽
        window.onload = function(){
            var oDiv = document.getElementById("div1");
            var disX = 0;
            var disY = 0;

            oDiv.onmousedown = function(ev){
                var ev = ev || window.event;

                disX = ev.clientX - oDiv.offsetLeft;
                disY = ev.clientY - oDiv.offsetTop;

                document.onmousemove = function(ev){
                    var ev = ev || window.event;

                    oDiv.style.left = ev.clientX - disX + "px";
                    oDiv.style.top = ev.clientY - disY + "px";
                }

                document.onmouseup = function(){
                    document.onmousemove = null;
                    document.onmouseup = null;
                }

                return false;

            }
        }
    */

    /* 第一步:普通方法變型
    //先變型
        var oDiv = null;
        var disX = 0;
        var disY = 0;

        window.onload = function(){
            oDiv = document.getElementById("div1");
            init();         
        }

        function init(){
            oDiv.onmousedown = fnDown;
        }

        function fnDown(ev){
            var ev = ev || window.event;

                disX = ev.clientX - oDiv.offsetLeft;
                disY = ev.clientY - oDiv.offsetTop;

                document.onmousemove = fnMove;
                document.onmouseup = fnUp;

                return false;
        }

        function fnMove(ev){
            var ev = ev || window.event;

            oDiv.style.left = ev.clientX - disX + "px";
            oDiv.style.top = ev.clientY - disY + "px";
        }

        function fnUp(){
            document.onmousemove = null;
            document.onmouseup = null;
        }
        */

        //改成面向?qū)ο?        window.onload = function(){
            var d1 = new Drag("div1");
            d1.init();          
        }

        function Drag(id){
            this.oDiv = document.getElementById(id);
            this.disX = 0;
            this.dixY = 0;
        }

        Drag.prototype.init = function(){
            var This = this;
            this.oDiv.onmousedown = function(ev){
                var ev = ev || window.event;
                This.fnDown(ev);
                return false;
            };
        }

        Drag.prototype.fnDown = function(ev) {
            var ev = ev || window.event;
            var This = this;

                this.disX = ev.clientX - this.oDiv.offsetLeft;
                this.disY = ev.clientY - this.oDiv.offsetTop;

                document.onmousemove = function(ev){
                    var ev = ev || window.event;
                    This.fnMove(ev);
                };
                document.onmouseup = this.fnUp;         
        }

        Drag.prototype.fnMove = function(ev){
            this.oDiv.style.left = ev.clientX - this.disX + "px";
            this.oDiv.style.top = ev.clientY - this.disY + "px";
        }

        Drag.prototype.fnUp = function(){
            document.onmousemove = null;
            document.onmouseup = null;
        }
    </script>
</head>
<body>
    <div   class="qgoykia"   id="div1"></div>
</body>
</html></pre>
<b>本課練習(xí)</b>

<p><p>為數(shù)組對象添加求和,最大值</p></p>
<p><p>為字符串對象添加判斷是不是最后一個字母</p></p>
<p><p>面向?qū)ο蟮倪x項卡</p></p>
<p><p>給選項卡添加一個自動播放的方法</p></p>
<p><p>任意學(xué)過的效果改寫成面向?qū)ο?/p></p>
<p><p>面向?qū)ο蟮拿嬖囶}</p></p>

<b>高級面向?qū)ο?/b>
<b>包裝對象</b>
<p>JS基于原型的程序<br>String Number Boolean</p>
<pre><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    
    



給基本類型添加方法



    
    
    
    



原型鏈

實例對象與原型之間的連接,叫做原型鏈

proto (隱式連接)

Object對象類型是原型鏈的最外層




    
    面向?qū)ο笾械脑玩?/title>
    <style></style>
    <script>
    
        //原型鏈:實例對象與原型之間的連接叫作原型鏈
        //_proto_ (隱式連接)
        //原型鏈的最外層是Object.prototype

        function Aaa(){
            
        }

        Aaa.prototype.num = 10;

        var a1 = new Aaa();
        alert(a1.num); //10 a1現(xiàn)在它自己下面找,找不到這個num,然后又通過原型鏈到了Aaa.prototype,到它下面去找,最終找到了num

        function Bbb(){
            this.num = 20;
        }

        Bbb.prototype.num = 10;
        var b1 = new Bbb();
        alert(b1.num); //20 簡單來講,實例上的方法的優(yōu)先級高于原型上的方法;本質(zhì)上來講,是從b1下面找num直接就找到了,于是就不需要再進(jìn)一步通過原型鏈去找到Bbb.prototype上的num了。

        function Ccc(){};
        var c1 = new Ccc();
        Object.prototype.num = 30; //彈出30 c1下找不到num;順著原型鏈找到Ccc也找不到num,繼續(xù)順著原型鏈往上找,找到Object.prototype,找到了num
        alert(c1.num);
    </script>
</head>
<body>
</body>
</html></pre>
<b>面向?qū)ο蟮囊恍傩院头椒?/b>
<b>hasOwnProperty()看是不是對象自身下面的屬性</b>
<pre><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>面向?qū)ο笾械脑玩?/title>
    <style></style>
    <script>
        //hasOwnProperty: 看是不是對象自身下面的屬性

        var arr = [];
        arr.num = 10;
        Array.prototype.num2 = 20;

        alert(arr.hasOwnProperty("num")); //true
        alert(arr.hasOwnProperty("num2")); //false
        alert(arr.hasOwnProperty == Object.prototype.hasOwnProperty); //true hasOwnProperty其實是Object.prototype下面的方法
    </script>
</head>
<body>
</body>
</html></pre>
<b>constructor查看對象的構(gòu)造函數(shù)</b>

<p><p>每個原型都會自動添加constructor屬性</p></p>
<p><p>for in 的時候,有些屬性是找不到的</p></p>
<p><p>避免修改constructor屬性</p></p>

<pre><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>面向?qū)ο笾械脑玩?/title>
    <style></style>
    <script>
        //constructor: 查看對象的構(gòu)造函數(shù)

        function Aaa(){

        }

        var a1 = new Aaa();

        alert(a1.constructor); //function Aaa

        var arr = [];
        alert(arr.constructor == Array); //true

        /*
        在寫完一個構(gòu)造函數(shù)之后
        function Aaa(){}
        程序會自動添加一句話:
        Aaa.prototype.constructor = Aaa; //每一個函數(shù)都會有的,都是自動生成的
        這時候new一個Aaa
        var a1 = new Aaa();
        alert(a1.constructor); //彈出Aaa
        如果手動寫一句:
        Aaa.prototype.constructor = Array;
        那么再去彈a1.constructor的話,彈出的就是Array了。

        而hasOwnProperty這個屬性是添加在Object.prototype下面的,所以每個對象下面去查這個hasOwnProperty也都會有。但是hasOwnProperty這個方法不是在具體對象下面的,而都是沿著原型鏈找到Object.prototype身上找到的。跟constructor是不一樣的。
        */

        function Bbb(){

        }

        Bbb.prototype.name = "小明";
        Bbb.prototype.age = 20;

        var b1 = new Bbb();
        alert(b1.constructor); //function Bbb()

        //下面這種寫法就無意識地改變了c1的constructor,因為json直接賦值給了Ccc.prototype,而不是向上面那段代碼是添加操作。那么原本系統(tǒng)自動生成的那句話Ccc.prototype.constructor = Ccc這句話就被覆蓋掉了。然后通過c1.constructor去找的話,其實找的就是這個json所對應(yīng)的constructor了。
        function Ccc(){

        }
        Ccc.prototype = {
            name: "小明",
            age: 20
        }
        var c1 = new Ccc();
        alert(c1.constructor); //function Object

        //為了避免上述問題,應(yīng)該注意,用json簡寫的時候,要把constructor修正過來,如下:

        function Ddd(){

        }
        Ddd.prototype = {
            constructor: Ddd, //通過這一句來修正一下
            name: "小明",
            age: 20
        }
        var d1 = new Ddd();
        alert(d1.constructor); //Ddd

    </script>
</head>
<body>
</body>
</html></pre>
<p><strong>for in循環(huán),有些屬性找不到</strong></p>
<pre><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>面向?qū)ο笾械脑玩?/title>
    <style></style>
    <script>
        function Aaa(){

        }
        Aaa.prototype.name = 10;
        Aaa.prototype.constructor = Aaa;
        for (var attr in Aaa.prototype){
            alert(attr); //只能找到自己添加的,系統(tǒng)自動生成的比如constructor,for in循環(huán)是找不到的
        }
    </script>
</head>
<body>
</body>
</html></pre>
<b>instanceof運算符</b>
<p>對象與構(gòu)造函數(shù)在原型鏈上是否有關(guān)系<br>可以用來作類型判斷</p>
<pre><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>instanceof()
    
    



toString()

object上的方法




    
    toString()
    
    



對象的繼承 什么是繼承

在原有對象的基礎(chǔ)上,略作修改,得到一個新的對象

不影響原有對象的功能

如何添加繼承

屬性:call

方法:for in

例子:繼承的拖拽

!DOCTYPE html>


    
    繼承
    
    






    
    繼承
    
    






    
    繼承
    
    



繼承的拖拽



    
    
    
    
    


    
繼承的其他形式

1、類式繼承
利用構(gòu)造函數(shù)(類)繼承的方式
2、原型繼承
借助原型來實現(xiàn)對象繼承對象
類式繼承




    
    
    
    



原型繼承




    
    原型繼承
    
    



拷貝繼承:通用型的 有new或無new的時候都可以

類式繼承:適合通過new構(gòu)造函數(shù)形式

原型繼承:比較適合無new的對象

組件開發(fā)

1、對象的多種表現(xiàn)形式

提高對象的復(fù)用性

如何配置參數(shù)和默認(rèn)參數(shù)

例子:拖拽

例子:彈窗

2、什么是組件?

對面向?qū)ο蟮纳钊霊?yīng)用(UI組件、功能組件)

將配置參數(shù)、方法、事件、三者進(jìn)行分離

3、創(chuàng)建自定義事件

有利于多人協(xié)作開發(fā)代碼

如何去掛載自定義事件與事件函數(shù)

4、例子:基于JQ的選項卡的組件開發(fā)模式
trigger() extend()等方法的使用
5、本課練習(xí)
組件開發(fā)的練習(xí)
http://tangram.baidu.com/magic/

如何配置參數(shù)和默認(rèn)參數(shù)



    
    組件開發(fā)中的參數(shù)問題
    


    

拖拽的組件開發(fā)



    
    
    
    
    


    
彈窗的組件開發(fā)



    
    彈窗的組件開發(fā)
    
    


    
    
    

    
    

理解自定義事件



    
    自定義事件
    


    

用原生js實現(xiàn)自定義事件



    
    自定義事件
    


    
div
span
配置、方法、自定義事件分離

——正規(guī)組件的寫法——基于拖拽的組件進(jìn)行的修改




    
    自定義事件的拖拽組件
    
    
    


    
用JQ實現(xiàn)選項卡的組件開發(fā)



    
    基于JQ的選項卡組件開發(fā)
    
    
    


    
111111
222222
333333
111111
222222
333333
111111
222222
333333
111111
222222
333333

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79368.html

相關(guān)文章

  • JS面向對象之一 【概述】

    摘要:更形象的我們還可以將面向?qū)ο罄斫鉃橐环N宗教信仰。這就導(dǎo)致面向?qū)ο蠼痰某绦騿T們在寫時就很難受。所以為了滿足信仰面向?qū)ο蠼痰男枨笸ㄟ^構(gòu)造函數(shù)的形式模擬了偽類。這個套路的核心就是類那么里沒有類所以其實是通過構(gòu)造函數(shù)來模擬的偽類。 JS面向?qū)ο笾?【概述】 在學(xué)習(xí)JS的面向?qū)ο笾?我們應(yīng)該先自問這樣幾個問題: 面向?qū)ο笫鞘裁匆馑? 學(xué)習(xí)面向?qū)ο蟮暮诵氖鞘裁? 為什么要學(xué)習(xí)面向?qū)ο?(它的...

    JohnLui 評論0 收藏0
  • 體驗javascript之美6:如果你覺得什么都會了或者不知道js學(xué)什么了看這里-面向對象編程

    摘要:面向過程函數(shù)式編程面向?qū)ο缶幊痰诙€并不是大家理解的那樣,我們先說舉個現(xiàn)實例子就明白了。多說一句函數(shù)是編程是非常強大也是我最喜歡的,以后再說,我們先說面向?qū)ο缶幊獭? 概述 當(dāng)大家已經(jīng)把js的語言基礎(chǔ)理解了,然后能夠?qū)懗鲆恍┖唵蔚睦恿?,這個時候基本上達(dá)到了一年工作經(jīng)驗的水平,而自己能夠獨立的寫一些小功能,完成一些小效果,或者臨摹修改一些比較復(fù)雜的插件的時候差不多就是兩年工作經(jīng)驗的水平,...

    changfeng1050 評論0 收藏0
  • JS對象(1)重新認(rèn)識面向對象

    摘要:對象重新認(rèn)識面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計模式上看,對象是計算機抽象現(xiàn)實世界的一種方式。除了字面式聲明方式之外,允許通過構(gòu)造器創(chuàng)建對象。每個構(gòu)造器實際上是一個函數(shù)對象該函數(shù)對象含有一個屬性用于實現(xiàn)基于原型的繼承和共享屬性。 title: JS對象(1)重新認(rèn)識面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計模式上看,對象是...

    superw 評論0 收藏0
  • 面向對象的 JavaScript

    摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對這一門語言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣鳌1疚膶⒒貧w面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...

    novo 評論0 收藏0
  • JS面向對象一:MVC的面向對象封裝

    摘要:自己的理解的第一個參數(shù)就是的值如果沒用默認(rèn)是那個調(diào)用函數(shù)的當(dāng)前的對象在全局作用域中就是被隱藏的所以不寫且在全局作用于調(diào)用函數(shù)的時候就是可以使用或者自己指定的指向 JS面向?qū)ο笠?MVC的面向?qū)ο蠓庋b MDNjavascript面向?qū)ο?面向?qū)ο?Object-Oriented) showImg(https://segmentfault.com/img/remote/1460000016...

    Scliang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<