JavaScript中幾個重要的知識點(1) ---- 面向對象

JavaScript中幾個最重要的大知識點

  1. 面向對象javascript

  2. DOM事件java

  3. 異步交互ajaxajax

面向對象

在JS中能夠把任意的引用和變量都當作是一個對象。面向對象的主要三個表現形式:數組

  • 封裝app

  • 繼承異步

  • 多態函數

1. 封裝
1.1 單例模式
var obj={
    name: "sam",
    age: 12,
    method: function(){
        var objName=this.name;
        return objName;
    },
    ale: function(){
        var that=this;
        function sum(num1,num2){
            this.num=that.age;
            return num1+this.num+num2;
        }
        console.log(sum(1,2));
    }
}

單例模式有不污染全局變量和節約window棧內存的優勢this

var main={
    init:function(){
        this.changeName();
    },
    changeName:function(){
        var that=this;
        var oBody=document.body;
        oBody.onclick=function(){
            that.changeValue();
        }
    },
    changeValue:function(){
        document.getElementById("one").value="sam";
    }
}

main.init();
1.2 工廠模式

可以快速地根據不一樣需求,傳入不一樣參數,來返回不一樣的對象,缺點是不能判斷對象的類型prototype

function self(name,age,sex){
    var person={};
    person.name=name;
    person.age=age;
    person.sex=sex;
    if(sex=="man"){
        person.job="coder";
    }
    if(sex=="woman"){
        person.job="beatiful";
    }
    return person;
}
var mine=self("sam",22,"man");
console.log(mine.job);
1.3 構造函數模式

構造函數模式可以解決工廠模式不能判斷對象類型的缺點,構造函數模式可以自定義類,構造具備相同屬性和方法的實例code

function Person(){
    this.eat="food";
    this.sleep="night";
    this.say=function(){
        console.log("I am person,I can speak");
    }
}
var person1=new Person();
person1.say();

call()和apply()方法

  • call()方法:
    讓調用對象執行,而後第一參數是誰,調用對象的this就改變指向是誰,後邊跟參數,依次對應傳入

  • apply()方法:
    讓調用對象執行,而後第一參數是誰,調用對象的this就改變指向是誰,後邊跟參數,以數組的形式傳入

2.繼承
2.1 原型繼承

把被繼承者的構造函數賦值給繼承者的prototype,注意須要給繼承者的prototype手動添加constructor屬性

function A(){
    this.name="A";
    this.sayHi=function(){
        console.log("Hi!I am A");
    }
}

function B(){
    this.name="B";
    this.age=22;
    this.sayHi=function(){
        console.log("Hi,I am B");
    }
}
B.prototype.work=function(){
    console.log("I can play");
}

A.prototype=new B();
A.prototype.constructor=A;
var a=new A();
console.log(a);
2.2 call / apply 繼承

把被繼承者設置的私有屬性,克隆一份做爲繼承者私有的

function A(){
    this.name="A";
    this.age=22;
    this.sayName=function(){
        console.log("I am A");
    }
}

function B(){
    A.call(this);
}

var b=new B();
console.log(b);
2.3 冒充對象繼承

繼承者繼承了被繼承者私有和公有的屬性和方法

function A(){
    this.x=100;
}
A.prototype.getX=function(){
    console.log(this.x);
}

function B(){
    var temp=new A();
    for(var key in temp){
        this[key]=temp[key];
    }
}

var b=new B();
console.log(b);
3. 多態

javascript中沒有嚴格的多態,由於JS中沒有重載,相同名字的函數不能同時存在,後定義的重名函數會覆蓋先定義的函數(即便兩個形參不相同)。咱們能夠寫一個通用方法來模擬面嚮對象語言的多態

function simPoly(){
    if(arguments.length==1){
        return function(){
            console.log(1);
        }
    }
    if(arguments.length==2){
        return function(){
            console.log(2);
        }
    }
}

simPoly(1,2)();
相關文章
相關標籤/搜索