最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript函數(shù)及其prototype詳解

 更新時(shí)間:2023年03月14日 08:39:41   作者:此時(shí)奮飛  
這篇文章主要介紹了JavaScript函數(shù)及其prototype詳解的相關(guān)資料,需要的朋友可以參考下

一、定義

函數(shù)可以通過(guò)聲明定義,也可以是一個(gè)表達(dá)式。

(1)函數(shù)聲明式:

分號(hào)是用來(lái)分隔可執(zhí)行JavaScript語(yǔ)句,由于函數(shù)聲明不是一個(gè)可執(zhí)行語(yǔ)句,所以不以分號(hào)結(jié)束。

function a(){
console.log('bbb');
}

(2)函數(shù)表達(dá)式:

函數(shù)表達(dá)式以分號(hào)結(jié)尾,因?yàn)樗且粋€(gè)執(zhí)行語(yǔ)句。

var a = function(){
console.log('aaa');
}

(3)聲明式變體:

var a = function a(){
console.log('bbb');
}

完全等價(jià)于 function b(){}

二、函數(shù)執(zhí)行

JavaScript解析器將當(dāng)前作用域內(nèi)聲明的所有變量和函數(shù)都會(huì)放到作用域的開(kāi)始處,但是,只有變量的聲明被提前到作用域的開(kāi)始處了,而賦值操作被保留在原處。

示例1:

var a = function(){
console.log('aaa');
}
function a(){
console.log('bbb');
}
a(); //結(jié)果:aaa

示例2:

(function() {
console.log(noSuchVariable);
})();
//報(bào)錯(cuò),因?yàn)閚oSuchVariable變量根本沒(méi)定義
</pre><pre name="code" class="javascript">(function() {
console.log(declaredLater); //"undefined"
var declaredLater = "Now it's defined!";
console.log(declaredLater); //"Now it's defined!"
})();
//上面這段代碼是正確的,沒(méi)有任何問(wèn)題。

示例3:

var a; // 聲明一個(gè)變量,標(biāo)識(shí)符為a
function a() {} // 聲明一個(gè)函數(shù),標(biāo)示符也為a
alert(typeof a); // function

function a() {}
var a;
alert(typeof a); //function

function a() {}
var a = 1;
alert(typeof a); //number

var a = 1;
function a() {}
alert(typeof a); //number

總結(jié):

  • 變量的聲明被提前到作用域頂部,賦值保留在原地;
  • 聲明式函數(shù)整個(gè)“被提前”;
  • 函數(shù)表達(dá)式只有變量“被提前”了,函數(shù)沒(méi)有“被提前”;
  • 函數(shù)會(huì)首先被提升,然后才是變量,重復(fù)的var(變量)聲明會(huì)被忽略掉;
  • 同名情況下,變量先“被提前”,函數(shù)再“再被提前”(即函數(shù)覆蓋變量);
  • 賦值會(huì)根據(jù)前后順序進(jìn)行覆蓋!

三、函數(shù)是對(duì)象[typeof instanceof]

在 JavaScript 中使用 typeof 操作符判斷函數(shù)類型將返回"function"。但JavaScript函數(shù)描述為一個(gè)對(duì)象更加準(zhǔn)確。JavaScript函數(shù)有屬性和方法。

(1)typeof區(qū)分對(duì)象和其他原始值

JavaScript的數(shù)據(jù)類型分為:原始類型(數(shù)字、字符串、布爾值、null、undefined)和對(duì)象類型。

typeof[任何類型]返回值(boolean、string、number、object、undefined)和 function

typeof 2; //'number'
typeof '2'; //'string'
typeof true; //'boolean'
typeof []; //'object'
typeof null; //'object'
typeof undefined; //'undefined'
var a = function(){}; typeof a; //'function'

對(duì)于所有內(nèi)置可執(zhí)行對(duì)象,typeof一律返回“function”

typeof new Number(2); //'object'
typeof new String('2'); //'object'
typeof new Boolean(true); //'object'

(2)instanceof[對(duì)象 instanceof 類]判斷一個(gè)對(duì)象是否為類的實(shí)例

[] instanceof Object; //true
2 instanceof Number; //false
new Number(2) instanceof Number; //true

示例:

var a = function(){};
var b = function(){};
a.prototype = new b();
new a() instanceof b; //true
new a() instanceof Object; //true

首先確定b.prototype,如果b.prototype在a對(duì)象的原型鏈中,返回true,否則返回false。

注意;所有對(duì)象都是Object的實(shí)例。

(3)擴(kuò)展 Object.prototype.toString.call([]) === '[object Array]';

四、prototype

JavaScript 對(duì)象有兩種不同的屬性,一種是對(duì)象自身的屬性,另外一種是繼承于原型鏈上的屬性。

JavaScript中,類的所有實(shí)例對(duì)象都從同一個(gè)原型對(duì)象上繼承屬性,因此,原型對(duì)象是類的核心。

(1)只有函數(shù)有prototype,對(duì)象沒(méi)有

var b = {};
b.prototype.bbb='bbb'; //報(bào)錯(cuò)b.prototype為undefined

function b(){}
b.prototype.bbb='bbb';
console.log(b); //結(jié)果:function b(){}
console.log(b.prototype); //結(jié)果:b {bbb: "bbb"}
console.log(b.bbb); //結(jié)果:undefined
console.log(new b().bbb); //結(jié)果:bbb

(2)prototype是函數(shù)的內(nèi)置屬性(用于設(shè)置函數(shù)的原型),__proto__是對(duì)象的內(nèi)置屬性(用于設(shè)置對(duì)象的原型)。

PS:注意區(qū)分函數(shù)和對(duì)象

function test(){}
test.prototype; //結(jié)果:test {}
new test().prototype; //結(jié)果:undefined,對(duì)象沒(méi)有prototype
new test().__proto__; //結(jié)果:test {}

function a(){
this.v='vvv';
}
a.prototype; //a {}
new a.__proto__; //a {}
new a().__proto__ === a.prototype; //true 實(shí)例對(duì)象的__proto__,指向函數(shù)的原型

(3)每個(gè)JavasScript函數(shù)都自動(dòng)擁有一個(gè)prototype屬性。這個(gè)屬性的值是一個(gè)對(duì)象,這個(gè)對(duì)象包含唯一一個(gè)不可枚舉屬性constructor。constructor屬性的值是一個(gè)函數(shù)對(duì)象。

function a(){
this.v='vvv';
}
a.prototype.constructor === a; //true[物理地址一樣]
a.prototype.constructor; //constructor屬性指代這個(gè)類
a.prototype.constructor.__proto__ === a.__proto__ === Function.prototype; //true
Object.prototype.constructor.__proto__ === Object.__proto__ === Function.prototype; //true

PS:所有構(gòu)造器、函數(shù)的__proto__都指向Function.prototype,它是一個(gè)空函數(shù)(Empty function)

(4)實(shí)例

示例1:

function a(){}
function b(){}
a.prototype = {aaa:'aaa'};
b.prototype = a.prototype;
var aa1 = new a();
var bb1 = new b();
//aa1.prototype.aaa='xxx'; //錯(cuò)誤,對(duì)象沒(méi)有原型
a.prototype.aaa = 'xxx';
console.log( aa1.aaa ); //xxx
console.log( bb1.aaa ); //xxx

補(bǔ)充:a===b; //false    a.prototype === b.prototype; //true

實(shí)例2:

function a(){}
function b(){ this.bbb='bbb'}
a.prototype = new b(); //相當(dāng)于a.prototype = {bbb: "bbb"};
console.log(new a().bbb ); //結(jié)果:bbb

補(bǔ)充:a.prototype === b.prototype;  //false

五、實(shí)例方法&靜態(tài)方法

(1)實(shí)例方法

function a(){}
a.prototype.count = 0;
var a1 = new a();
a1.count++;
var a2 = new a();
a2.count++;
a.prototype.count; //0

PS:方法類似 a.prototype.method = function(){}

(2)靜態(tài)方法

function a(){}
a.count = 0;
new a().count(); //undefined,只能使用a.count調(diào)用

PS:方法類似 a.method = function(){}

(3)當(dāng)代碼var p = new Person()執(zhí)行時(shí),new 做了如下幾件事情:

  A. 創(chuàng)建一個(gè)空白對(duì)象

  B. 創(chuàng)建一個(gè)指向Person.prototype的指針

  C. 將這個(gè)對(duì)象通過(guò)this關(guān)鍵字傳遞到構(gòu)造函數(shù)中并執(zhí)行構(gòu)造函數(shù)

六、閉包

函數(shù)定義時(shí)的作用域鏈到函數(shù)執(zhí)行時(shí)依然有效。

示例-典型閉包:

var scope = "global scope";
function checkScope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkScope(); //local scope

示例:更為常用的閉包

function counter(){
var n=0;
return{
count:function(){
return ++n;
},
reset:function(){
n=0;
}
};
}
var c1 = new counter();
c1.count(); //1
var c2 = new counter();
c2.count(); //1
c1.reset(); //c1置為0,c2不受影響
c2.count(); //2

PS:實(shí)例對(duì)象互相不影響,單個(gè)實(shí)例對(duì)象內(nèi)的方法,共享私有變量。

七、通過(guò)調(diào)用方法的形式來(lái)間接調(diào)用函數(shù):apply&call

function a(){
console.log(this.x+this.y);
}
a.call({x:100,y:100}); //200

function C(){
this.m = function(){
console.log(this.x+this.y);
}
}
var c = new C();
c.m.call({x:100,y:100}); //200

call&apply第一個(gè)實(shí)參是要調(diào)用函數(shù)的母對(duì)象,會(huì)變?yōu)閠his的值。

函數(shù).call(對(duì)象,參數(shù)1,參數(shù)2);

函數(shù).apply(對(duì)象,[參數(shù)1,參數(shù)2]); //數(shù)組形式

補(bǔ)充:

function a(a,b,c,d){

? //將偽數(shù)組轉(zhuǎn)變?yōu)檎鏀?shù)組

? var args = [].slice.call(arguments);

}

八、函數(shù)中this

function a(){
console.log(this); //a {}
function b(){
console.log(this); //window
}
b();
}
new a();

特別注意:函數(shù)內(nèi)部函數(shù)this指向window

此問(wèn)題在嚴(yán)格模式已被修改;在非嚴(yán)格模式中,可使用變量接收外部函數(shù)this供內(nèi)部函數(shù)使用,如var that = this;

九、回調(diào)(函數(shù)當(dāng)參數(shù))

function a(callback){

callback();

}

a(function(){

console.log('aaa');

});

更加靈活,主頁(yè)面只需為子頁(yè)面提供對(duì)應(yīng)接口,具體處理邏輯全部由子頁(yè)面處理。

到此這篇關(guān)于JavaScript函數(shù)及其prototype詳解的文章就介紹到這了,更多相關(guān)JavaScript函數(shù)及其prototype內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)下滑到底部自動(dòng)翻頁(yè)功能

    微信小程序?qū)崿F(xiàn)下滑到底部自動(dòng)翻頁(yè)功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)下滑到底部自動(dòng)翻頁(yè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • js 編碼轉(zhuǎn)換 gb2312 和 utf8 互轉(zhuǎn)的2種方法

    js 編碼轉(zhuǎn)換 gb2312 和 utf8 互轉(zhuǎn)的2種方法

    這篇文章介紹了gb2312 和 utf8 互轉(zhuǎn)的JS方法,有需要的朋友可以參考一下
    2013-08-08
  • js模糊查詢實(shí)例分享

    js模糊查詢實(shí)例分享

    本文主要分享了js模糊查詢的實(shí)現(xiàn)代碼,沒(méi)有接觸到后臺(tái)數(shù)據(jù)的知識(shí),只是查詢當(dāng)前表格中每一行所包含的關(guān)鍵字。具有一定的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • JavaScript 函數(shù)式編程實(shí)踐(來(lái)自IBM)

    JavaScript 函數(shù)式編程實(shí)踐(來(lái)自IBM)

    說(shuō)到函數(shù)式編程,人們的第一印象往往是其學(xué)院派,晦澀難懂,大概只有那些蓬頭散發(fā),不修邊幅,甚至有些神經(jīng)質(zhì)的大學(xué)教授們才會(huì)用的編程方式。
    2010-06-06
  • JavaScript實(shí)戰(zhàn)之菜單特效

    JavaScript實(shí)戰(zhàn)之菜單特效

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)戰(zhàn)之菜單特效實(shí)現(xiàn)代碼,具有與一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • JS控制GIF圖片的停止與顯示

    JS控制GIF圖片的停止與顯示

    這篇文章主要為大家詳細(xì)介紹了JS控制GIF圖片的停止與顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 詳解微信小程序canvas圓角矩形的繪制的方法

    詳解微信小程序canvas圓角矩形的繪制的方法

    這篇文章主要介紹了詳解微信小程序canvas圓角矩形的繪制的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • JavaScript中import用法總結(jié)

    JavaScript中import用法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于JavaScript中import用法知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2019-01-01
  • 原生JS實(shí)現(xiàn)拖拽效果

    原生JS實(shí)現(xiàn)拖拽效果

    這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • javascript讀寫(xiě)XML實(shí)現(xiàn)廣告輪換(兼容IE、FF)

    javascript讀寫(xiě)XML實(shí)現(xiàn)廣告輪換(兼容IE、FF)

    最近更新網(wǎng)站首頁(yè)廣告,ASP.NET的廣告控件很容易實(shí)現(xiàn)這點(diǎn),可首頁(yè)是靜態(tài)頁(yè)面,聯(lián)想廣告控件的原理決定采用javascript+xml實(shí)現(xiàn)這點(diǎn)方面配置,更新廣告時(shí)只要更新xml即可,方便了廣告輪換
    2013-08-08

最新評(píng)論

延吉市| 星座| 新昌县| 建湖县| 门头沟区| 襄垣县| 瓮安县| 封开县| 惠水县| 南部县| 内丘县| 平度市| 文山县| 墨玉县| 来凤县| 安溪县| 辉县市| 乐业县| 金坛市| 怀化市| 胶南市| 水富县| 咸丰县| 会宁县| 平定县| 武城县| 深州市| 镇江市| 上高县| 雅江县| 芮城县| 吴川市| 保定市| 桐乡市| 苏州市| 金溪县| 乐平市| 腾冲县| 伊吾县| 新丰县| 临城县|