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