我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript函数及其prototype详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript函数及其prototype详解

一、定义

函数可以通过声明定义,也可以是一个表达式。

(1)函数声明式:

分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句,所以不以分号结束。

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

(2)函数表达式:

函数表达式以分号结尾,因为它是一个执行语句。

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

(3)声明式变体:

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

完全等价于 function b(){}

二、函数执行

JavaScript解析器将当前作用域内声明的所有变量和函数都会放到作用域的开始处,但是,只有变量的声明被提前到作用域的开始处了,而赋值操作被保留在原处。

示例1:

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

示例2:

(function() {
console.log(noSuchVariable);
})();
//报错,因为noSuchVariable变量根本没定义
</pre><pre name="code" class="javascript">(function() {
console.log(declaredLater); //"undefined"
var declaredLater = "Now it's defined!";
console.log(declaredLater); //"Now it's defined!"
})();
//上面这段代码是正确的,没有任何问题。

示例3:

var a; // 声明一个变量,标识符为a
function a() {} // 声明一个函数,标示符也为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

总结:

  • 变量的声明被提前到作用域顶部,赋值保留在原地;
  • 声明式函数整个“被提前”;
  • 函数表达式只有变量“被提前”了,函数没有“被提前”;
  • 函数会首先被提升,然后才是变量,重复的var(变量)声明会被忽略掉;
  • 同名情况下,变量先“被提前”,函数再“再被提前”(即函数覆盖变量);
  • 赋值会根据前后顺序进行覆盖!

三、函数是对象[typeof instanceof]

在 JavaScript 中使用 typeof 操作符判断函数类型将返回"function"。但JavaScript函数描述为一个对象更加准确。JavaScript函数有属性和方法。

(1)typeof区分对象和其他原始值

JavaScript的数据类型分为:原始类型(数字、字符串、布尔值、null、undefined)和对象类型。

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'

对于所有内置可执行对象,typeof一律返回“function”

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

(2)instanceof[对象 instanceof 类]判断一个对象是否为类的实例

[] 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对象的原型链中,返回true,否则返回false。

注意;所有对象都是Object的实例。

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

四、prototype

JavaScript 对象有两种不同的属性,一种是对象自身的属性,另外一种是继承于原型链上的属性。

JavaScript中,类的所有实例对象都从同一个原型对象上继承属性,因此,原型对象是类的核心。

(1)只有函数有prototype,对象没有

var b = {};
b.prototype.bbb='bbb'; //报错b.prototype为undefined

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

(2)prototype是函数的内置属性(用于设置函数的原型),__proto__是对象的内置属性(用于设置对象的原型)。

PS:注意区分函数和对象

function test(){}
test.prototype; //结果:test {}
new test().prototype; //结果:undefined,对象没有prototype
new test().__proto__; //结果:test {}

function a(){
this.v='vvv';
}
a.prototype; //a {}
new a.__proto__; //a {}
new a().__proto__ === a.prototype; //true 实例对象的__proto__,指向函数的原型

(3)每个JavasScript函数都自动拥有一个prototype属性。这个属性的值是一个对象,这个对象包含唯一一个不可枚举属性constructor。constructor属性的值是一个函数对象。

function a(){
this.v='vvv';
}
a.prototype.constructor === a; //true[物理地址一样]
a.prototype.constructor; //constructor属性指代这个类
a.prototype.constructor.__proto__ === a.__proto__ === Function.prototype; //true
Object.prototype.constructor.__proto__ === Object.__proto__ === Function.prototype; //true

PS:所有构造器、函数的__proto__都指向Function.prototype,它是一个空函数(Empty function)

(4)实例

示例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'; //错误,对象没有原型
a.prototype.aaa = 'xxx';
console.log( aa1.aaa ); //xxx
console.log( bb1.aaa ); //xxx

补充:a===b; //false    a.prototype === b.prototype; //true

实例2:

function a(){}
function b(){ this.bbb='bbb'}
a.prototype = new b(); //相当于a.prototype = {bbb: "bbb"};
console.log(new a().bbb ); //结果:bbb

补充:a.prototype === b.prototype;  //false

五、实例方法&静态方法

(1)实例方法

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)静态方法

function a(){}
a.count = 0;
new a().count(); //undefined,只能使用a.count调用

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

(3)当代码var p = new Person()执行时,new 做了如下几件事情:

  A. 创建一个空白对象

  B. 创建一个指向Person.prototype的指针

  C. 将这个对象通过this关键字传递到构造函数中并执行构造函数

六、闭包

函数定义时的作用域链到函数执行时依然有效。

示例-典型闭包:

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:实例对象互相不影响,单个实例对象内的方法,共享私有变量。

七、通过调用方法的形式来间接调用函数: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第一个实参是要调用函数的母对象,会变为this的值。

函数.call(对象,参数1,参数2);

函数.apply(对象,[参数1,参数2]); //数组形式

补充:

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

  //将伪数组转变为真数组

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

}

八、函数中this

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

特别注意:函数内部函数this指向window

此问题在严格模式已被修改;在非严格模式中,可使用变量接收外部函数this供内部函数使用,如var that = this;

九、回调(函数当参数)

function a(callback){

callback();

}

a(function(){

console.log('aaa');

});

更加灵活,主页面只需为子页面提供对应接口,具体处理逻辑全部由子页面处理。

到此这篇关于JavaScript函数及其prototype详解的文章就介绍到这了,更多相关JavaScript函数及其prototype内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript函数及其prototype详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript函数及其prototype详解

这篇文章主要介绍了JavaScript函数及其prototype详解的相关资料,需要的朋友可以参考下
2023-03-14

JavaScript函数及prototype怎么使用

这篇文章主要介绍“JavaScript函数及prototype怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript函数及prototype怎么使用”文章能帮助大家解决问题。一、
2023-07-05

fgets函数及其用法,C语言fgets函数详解

fgets函数是C语言中用来从指定的流中读取一行数据的函数。它的原型如下:```cchar *fgets(char *str, int n, FILE *stream);```fgets函数的三个参数分别是:- `str`:字符指针,用来存
2023-09-09

numpy函数大全及其用途:详解numpy库中的所有函数

numpy函数大全:详解numpy库中的全部函数及其用途,需要具体代码示例导语:在数据分析和科学计算领域中,常常需要处理大规模的数值数据。numpy是Python中最常用的一个开源库,提供了高效的多维数组对象和一系列用于操作数组的函数。本
numpy函数大全及其用途:详解numpy库中的所有函数
2024-01-26

fseek()函数的用法及其理解

fseek()函数是C语言中的文件操作函数,用于设置文件指针的位置。它的原型如下:int fseek(FILE *stream, long offset, int origin);其中,stream是指向要操作的文件的指针;offset是偏
2023-09-09

JavaScript函数防抖与函数节流的定义及使用详解

这篇文章主要为大家详细介绍一下JavaScript中函数防抖与函数节流的定义及使用,文中的示例代码讲解详细,对我们学习JS有一定帮助,需要的可以参考一下
2022-11-13

详解JavaScript中的replace()函数

JavaScript中的replace()函数是用于替换字符串中的某个子串的方法。该方法接受两个参数:要替换的子串和替换后的字符串。语法:string.replace(searchValue, replaceValue)参数说明:- sea
2023-09-09

JavaScript 中的 parseInt() 函数详解

parseInt函数将其第一个参数转换为一个字符串,对该字符串进行解析,然后返回一个整数或 NaN,这篇文章主要介绍了JavaScript 的 parseInt() 函数,需要的朋友可以参考下
2023-05-19

编程热搜

目录