call和apply还有bind

有图有真相

 function myfun1(){
    //这是私有属性
    var private1 = "这是私有属性1";
    var privateMethod = function(){
        alert(private1);
    }
    //这是实例属性
    this.publicvar = "这是实例属性1";
    this.public1 = function(){
        privateMethod();
    }
}

//-//--------------//-//---------------------------------
 var newfun1 = new myfun1();
newfun1.public1(); //这是私有属性
alert(newfun1.publicvar);//这是实例属性
alert(newfun1.private1); // undefined   newfun1.privateMethod(); //运行错误

//--//--//---///------------------------------------------
//--//--//---///-------------------执行1-------------------
//--//--//---///------------------------------------------
function myfun2(){
}
myfun2.staticvar = "这是静态属性2";
myfun2.staticmethod = function(){
    alert(myfun2.staticvar);
}
//--//--//---///------------------------------------------
//--//--//---///-------------------执行2-------------------
//--//--//---///------------------------------------------
var newfun2 = new myfun2();
//newfun2.staticmethod();//运行错误;
alert(newfun2.staticvar);//undefined
//------//-------------//-------------------------------
//静态私有成员
var myfun3 = (function(){
    function privateProperty(){
    
    }
    privateProperty.staticvar = "这是静态私有成员3";
    privateProperty.staticmethod = function(){
        alert(privateProperty.staticvar);
    }
    privateProperty.staticmethod();
    return privateProperty
})();
alert(newfun3.staticvar);//这是静态私有成员3
//---//--------//-----------------//-------------
//静态类
var funcount = 0;
var myfun4 = new function(){
    funcount++;
    this.printCount = function(){
        alert(funcount);
    }
}
myfun4.printCount(); //输出1;
myfun4.printCount(); //输出1;
myfun4.prototype.amethod = function(){
    alert("原型对象4");
}//运行错误
var newfun4 = new myfun4();
newfun4.amethod();
//------------------//---------------------------------
//运行错误,说明myfun3创建并实例化之后就不能再为它添加方法,属性
new myfun3.constructor().printCount();//如果你确实想实例化,这样也可以.
//原型继承
var myfun5 = function(){

}
myfun5.prototype.myfun5_extend = function(){
    alert("这是原型继承的5");
}
var myfun5_sub = function(){

}
myfun5_sub.prototype = new myfun5();
var newfun5 = new myfun5_sub();
newfun5.myfun5_extend(); //这是原型继承的
//调用继承
var myfun6 = function(){
    this.method_p = function(){
        alert("这是调用继承的6");
    }
}
var myfun6_sub = function(){
    myfun6.call(this);
}

var newfun6 = new myfun6_sub();
newfun6.method_p();//这是调用继承的
//覆盖
var myfun7 = function(){
    this.method = function(){
        alert("这是父对象方法7");
    }
}
var myfun7_sub = function(){
    this.method = function(){
        alert("这是子对象方法8");
    }
}
myfun7_sub.prototype = new myfun7();
var newfun7 = new myfun7_sub();
newfun7.method(); //这是子对象方法,父对象方法被覆盖了.
//多态
function myfun8(a, b){
    var a = a;
    var b = b;
    if (typeof a == "number" && typeof b == "number") {
        alert(a * b);
    } else if (typeof a == "string" && typeof b == "string") {
        alert(a + b);
    } else {
        alert("输入错啦");
    }
}

myfun8(3, 4); // 输出12;
myfun8("hi,", "你好");//输出hi,你好;
myfun8("hi", 5);//输入错啦.

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。