-
Object.defineProperty()方法
傳入三個參數(shù)
1.obj:需要定義屬性的對象。
2.prop:需要定義的屬性。
3.descriptor:屬性的描述描述符
返回值:返回此對象。
var obj={};
var descroptor={
configurable:false//表示該屬性能否通過delete刪除,能否修改屬性的特性或者能否修改訪問器屬性,默認(rèn)為false.當(dāng)且僅當(dāng)該屬性為true時,才能實現(xiàn)上述行為。
writeable:false//表示該屬性的值是否可寫,默認(rèn)為false.當(dāng)且僅當(dāng)該屬性為true時,才能實現(xiàn)上述行為。)
}
enumerable:false,表示該屬性是否可以枚舉,即是否通過for...in訪問屬性 默認(rèn)是false.
value:hello world.表示該屬性的值,默認(rèn)是undefinde
查看全部 -
js繼承的6種方式:
簡單原型鏈:類式繼承
借用構(gòu)造函數(shù):缺點=>父類的原型方法自然不會被子類繼承
組合繼承(最常用):類式繼承+構(gòu)造函數(shù)式繼承
寄生組合繼承(最佳方式):寄生式繼承+構(gòu)造函數(shù)式繼承
原型式:跟類式繼承一樣。父類對象book種的值類型的屬性被復(fù)制,引用類型的屬性被共有。
寄生式:通過在一個函數(shù)內(nèi)的過度對象實現(xiàn)繼承并返回新對象的方式。
查看全部 -
Function 對象和object對象之間的關(guān)系Person AA
Function是頂層的構(gòu)造器,Object是頂層的對象{}
頂層現(xiàn)有null,Object.prototype,Function.prototype Function
從原型上說:Function繼承了Object
構(gòu)造器上說:Function構(gòu)造了Object? new Object
function object(){}
查看全部 -
構(gòu)造函數(shù)構(gòu)建類
function Person(name,age){
this.name=name
this.age=age
this.say=function(){
console.log('我是'+this.name)
}
}
var p1=new Person('張三',18)
var p2=new Person('李四',20)
構(gòu)造函數(shù)object
原型和原型鏈
1萬物皆對象,萬物皆空 (對象最終指向null)
2原型:保存所有子對象的共有屬性值和方法的父對象。
原型鏈:是各級子對象的_proto_屬性連續(xù)引用形成的結(jié)構(gòu)。
3.三個屬性:_proto_,constructor,prototype
_proto_下劃線開始下劃線結(jié)束都是js內(nèi)部屬性
查看全部 -
什么是對象:
1具備私有屬性{a:1}
只要是new出來的都是對象,new fun()=>實例化
不同對象肯定不相等 var a=[1]; var b=[1]; a==b =.false
對象都會有引用機(jī)制 堆 棧
js中萬物皆對象 Array Date Object Function String
面向?qū)ο螅?/p>
把任何的數(shù)據(jù)和行為抽象成一個形象的對象,類似于人生活中思考的方式,
類:對象(object)的模板,定義了同一組對象(又稱“實例”)共有的屬性和方法
面向?qū)ο髈op:繼承 封裝 多態(tài)
繼承:子繼承父
封裝:方法 function(){}? 把方法寫在function里面
多態(tài):重載,重寫。 繼承 父類 覆蓋掉父類方法
查看全部 -
this的坑
this的指向
指代當(dāng)前調(diào)用的對象,四種綁定規(guī)則分別是:默認(rèn)綁定,隱式綁定,顯示綁定,new綁定,優(yōu)先級從低到高。
查看全部 -
new統(tǒng)稱為實例化。
4步:
1新創(chuàng)建一個對象obj
2把obj的proto指向構(gòu)造函數(shù)的prototype對象,實現(xiàn)繼承。
3將步驟1新創(chuàng)建的對象obj作為this的上下文
4返回創(chuàng)建的對象obj(如果該函數(shù)沒有返回對象,則返回this)
查看全部 -
Function對象call,apply,bind
1,apply()方法調(diào)用一個函數(shù),其中有一個指定的this值,以及作為一個數(shù)組(或類似數(shù)組的對象)提供的參數(shù)。
Function.apply(obj,args)方法能接收兩個參數(shù)。
**call和apply的區(qū)別
call是單個的參數(shù)傳入,apply是以數(shù)組的形式傳入。var arr=Array.prototype.slice.apply(arguements)//arguements就是一個類數(shù)組
bind :類似與call 但是與其不同的是,call調(diào)用之后可以立即執(zhí)行,但是bind需要用一個變量進(jìn)行接受之后再執(zhí)行
比如
var val= stu1.say.bind 這樣
查看全部 -
閉包本質(zhì)就是作用域
1,是引用了自由變量得函數(shù)這個被引用得自由變量將和這個函數(shù)一同存在,及時離開了創(chuàng)造他得環(huán)境也不例外。所以 有另一種說法認(rèn)為閉包是自由函數(shù)和其相關(guān)的引用環(huán)境組合而成。
閉包的缺點:會導(dǎo)致內(nèi)存的駐留。
let也可以實現(xiàn)信息駐留
查看全部 -
開發(fā)中重載
在程序中可以定義相同名字,不同參數(shù)的形式的不同函數(shù),函數(shù)在調(diào)用的函數(shù)的時候,自動識別不同參數(shù)對應(yīng)的函數(shù),實現(xiàn)了相同函數(shù)名不同的函數(shù)調(diào)用
function React(){//arguments[x,y,z]參數(shù)值,類數(shù)組 x? xy? xyz
//如果傳入的是一個參數(shù),那就返回一個正方形
if(arguments.length>=1){
this.width=arguments[0];
this.height=arguments[0];
}
//如果傳入的是兩個參數(shù),那就返回一個長方形
if(arguments.length>1){
this.width=arguments[0];
this.height=arguments[1];
}
this.toString=function(){
return 'width:'+this.width+'height:'+this.height;
}
}
var r1=new React(10);
console.log(r1.toString());
var r2=new React(10,9);
console.log(r2.toString());
多態(tài):同一個東西表現(xiàn)得不同狀態(tài),重寫和重載
查看全部 -
js執(zhí)行環(huán)境
單線程執(zhí)行
執(zhí)行環(huán)境(執(zhí)行上下文)
全局執(zhí)行環(huán)境
局部執(zhí)行環(huán)境
變量對象:vo? variable object 一般是全局環(huán)境下保存變量的對象{a:1,b:2....}
活動對象:AO Activation object 函數(shù)的執(zhí)行環(huán)境是在調(diào)用時創(chuàng)建的,該對象將代替vo對象來保存當(dāng)前函數(shù)環(huán)境中的變量,參數(shù),函數(shù),所以在函數(shù)執(zhí)行環(huán)境中vo就是AO function(){a==1,b==1}
查看全部 -
js es5中
作用域scope 一個變量的可用范圍;{a:1}{b:2}這些都是作用域。兩個互不相干,一個封閉式環(huán)境內(nèi)保證我這個變量能用,兩個不相關(guān)聯(lián)的作用域,再沒有任何外部關(guān)聯(lián)的情況下不能相互作用。作用域鏈 scope chain:以當(dāng)前作用域的scope屬性為起點依次引用每個AO(active object),直到window結(jié)束,形成多級引用關(guān)系?!緖a:1}--{b:2}--{}--{}--{}--...window】作用域鏈
js作用域:ES5
分為兩大類:全局作用域(js-window,var a=1就是一個全局作用域,所有的函數(shù)里面要用也是能找到的。),函數(shù)作用域( function(){},每定義一個function 大括號里面就是一個作用域。 )。
查看全部 -
js解析:預(yù)編譯期(預(yù)處理,預(yù)解析,預(yù)編譯)和執(zhí)行期
預(yù)編譯預(yù)解析,當(dāng)javaScript引擎解析腳本時、,它會在預(yù)編譯期對所有聲明的變量和函數(shù)進(jìn)行處理,并且是先預(yù)聲明變量再預(yù)定義函數(shù)。
變量聲明提前,函數(shù)聲明提前,變量聲明提前值留在本地。函數(shù)是整個代碼體提前,注意如果是var fn 聲明的只是變量提前,函數(shù)體停留在本地。
console.log(a)//undefined
var a =10
function fn() {}
function test(){ //hoist 聲明提前
a =100;
console.log(a);
console.log(fn)
}
test();
console.log(a);
test()沒寫或者隱藏時,這里面提前的只是 var a 變量 var a=10 就變成了var a? ? a=10(值得位置不變,僅僅變量聲明提前。整個函數(shù)提前,方法函數(shù)位置不動。)
在全局時候 他會把變量和函數(shù)提前到前面去。在函數(shù)內(nèi)部只做函數(shù)內(nèi)部得一個提前
查看全部 -
(1)匿名函數(shù):
定義時候沒有任何變量引用的函數(shù)
偶爾用到
function(){}()這種
jquery中:
(function(window,undefined){
var jQuery
window.jQuery = window.$ =jQuery;
}
)(window)
優(yōu)點就是節(jié)約內(nèi)存空間,調(diào)用前和調(diào)用后內(nèi)存中不創(chuàng)建任何函數(shù)對象。
(2)回調(diào)函數(shù)(callback):將一個函數(shù)作為對象交給其他函數(shù)使用
var arr =[13,6,65,50,23]
arr.sort(function(a,b){return a-b})傳入的這個函數(shù)就是回調(diào)函數(shù)
異步回調(diào):ajax
通過請求接口,(請求后端的數(shù)據(jù))
function getPrice(inputparams,callback){
$.ajax({
url: ctx + '/xxxx',
type: "post",
date:{'field':inputParams},
async:true,
success:function(date){
//success 成功之后,將數(shù)據(jù)換到回調(diào)的data當(dāng)中(date)前面也是沒有名字的匿名函數(shù)。
result =data;
callback(result);//callback去執(zhí)行整個一個結(jié)果
}});
}
(3)遞歸函數(shù)(循環(huán)調(diào)用函數(shù)本身)
var f =function(x){
if(x ===2){
return x;
}else{
return x*f(x-1);
}
};
通過arguments.callee的方式,arguments.callee從語法上來說就是函數(shù)本身。(在嚴(yán)格模式下不支持使用)
function f(x){
if(x ===1){
return 1;
}else{
return x*arguments.callee(x-1);
}
}
(4)構(gòu)造函數(shù):構(gòu)造函數(shù)習(xí)慣上首寫字母為大寫。調(diào)用方式不一樣。
Person()這個構(gòu)造函數(shù),Person即是函數(shù)名,也是這個對象的類名。
function Person(){}? 這邊一般是用new Person()來構(gòu)造一個函數(shù)出來
function person(){} 這邊是當(dāng)作一個方法,封裝的一個方法來使用
兩者區(qū)別不是很大
查看全部 -
history
window.history屬性指向history對象,表示當(dāng)前窗口的瀏覽歷史。(棧的數(shù)據(jù)結(jié)構(gòu))
History.back()瀏覽器回退
History.foeward()前進(jìn)
HIstory.go(-1)
【pushState()相當(dāng)于數(shù)組的push
replaceState()替換】vue router vue路由是用這種方式作的
查看全部
舉報