js 構(gòu)造函數(shù)
<h1>目前最流行的自定義</h1>
先說(shuō)一下構(gòu)造函數(shù)執(zhí)行過(guò)程
new 的作用
創(chuàng)建一個(gè)對(duì)象,將函數(shù)作用域賦予這個(gè)的對(duì)象,執(zhí)行構(gòu)造函數(shù)代碼,返回新對(duì)象
function Createfun(a,b){
this.a=a;
this.b=b;
this.m=[1,2,3]
}
Createfun.prototype={ //重寫(xiě)原型對(duì)象
constructor:Createfun,
geta:function(){
alert(this.a);
}
}
//增加原型方法
Createfun.prototype.geta=function(){alert(this.a)}
//通過(guò)檢查某個(gè)方法是否存在檢查是否需初始化原型
function Createfun(){
this.a=a;
this.b=b;
if(typeof this.geta !="function"){
Createfun.prototype.geta=function(){alert(this.a)};
}
}
js 繼承
<H1>實(shí)現(xiàn)繼承主要是通過(guò)js的原型鏈來(lái)實(shí)現(xiàn)的</H1>
<h2>原型和原型鏈</h2>
<span>用例子來(lái)說(shuō)明</span>
function f1(){
.....
}
var f=new f1();
<textarea>
每個(gè)函數(shù)都包含一個(gè)prototype屬性
原型對(duì)象都包含一個(gè)constructor屬性 值為指針
函數(shù)與原型對(duì)象之間的關(guān)系
prototype 指向原型對(duì)象 f1 Prototype
f1 Prototype中的constructor指向 f1
實(shí)例與原型對(duì)象之間的關(guān)系
實(shí)例對(duì)象上都包含一個(gè)[[Prototype]]//proto
指向原型對(duì)象
f 存在一個(gè)proto指向 f1 Prototype
</textarea>
這時(shí)如果來(lái)一個(gè)
function f2(){
.....
}
f2.prototype=new f1();
將f1的實(shí)例復(fù)制給f2 prototype//此處實(shí)際是重寫(xiě)f2的原型對(duì)象
//增加的話 是f2.prototype.xx=function(){};
此時(shí) f2Prototype變成了f1的一個(gè)實(shí)例
那么f2Prototype中也有了proto 指向 創(chuàng)建它的構(gòu)造函數(shù)的原型對(duì)象 也就是f1.Prototype
這時(shí)
var instance_f2=new f2();
instance_f2既可以訪問(wèn)f2的原型對(duì)象的屬性方法 也可以訪問(wèn)f1的原型對(duì)象的屬性方法
另外 所有函數(shù)的原型都是Object的實(shí)例
可以稱Object為頂層原型對(duì)象
Js 閉包
閉包就是函數(shù)中包含函數(shù),被包含的函數(shù)能夠訪問(wèn)包含函數(shù)的作用域。
function Cover(){
var cover_a="111";
var bibao_fun=function(){
alert(cover_a);
}
}
閉包常用語(yǔ)創(chuàng)建私有作用域
function Cover(){
//私有變量
var cover_a=1;
var bibao_fun=function(){
alert(cover_a);
}
//公有函數(shù)訪問(wèn)私有變量
this.publicfun=function(){
cover_a++;
bibao_fun();
alert(cover_a);
}
}
var test1=new Cover();
console.log(test1.cover_a)//error
test1.publicfun();//right,2
var test2=new Cover();
test2.publicfun();//right,2
//私有變量非靜態(tài)
創(chuàng)建靜態(tài)私有變量
創(chuàng)建塊級(jí)作用域
(function(){
var private1=1;
function privatefun(){
return private1;
}
Private=function(){ //創(chuàng)建了全局變量 ,私有變量在調(diào)用后會(huì)立即銷毀,除非其賦予全局變量或在函數(shù)中使用
};
Private.prototype.publicfun=function(){
private1++; //被使用
return privatefun();
}
})()
var p1=new Private();
var result1=p1.publicfun();
var p2=new Private();
var result2=p2.publicfun();
console.log(result1);//2
console.log(result2);//3
單實(shí)例對(duì)象模塊模式
var singleobj=function(){
var private1=1;
function privatefun(){
return private1;
}
var newobj=new Object();
newobj.newpro=11;
newobj.newfun=function(){
private1++;
return privatefun();
}
return newobj;
}();
console.log(singleobj.newfun());//2