JavaScript的学习笔记....函数,原型prototype,this

笔记整理于视频:https://b23.tv/BV1YW411T7GX/p70

函数
main(Fun())和main(fun);
Fun()和Fun的区别:
fun()为调用函数,相当于使用的函数的返回值,
fun为函数对象,相当于直接使用对象。

—立即执行函数
函数定义后,立即执行,立即执行函数只执行一次。
(function(){
alert(“我是一个匿名函数”)
})();

—作用域
作用域指一个变量的作用的范围;
在js中一共有两种作用域,
1.全局作用域
-直接下载script标签的js代码,都在全局作用域;
-全局作用域在页面打开时创建,在页面关闭时销毁;
-在全局作用域有一个全局对象window,他代表的是一个浏览器,我们可以直接使用,
-在全局作用域中,创建的变量都会作为window对象的属性保存,
var a = 20;
console.log(window.a);//20

var

变量的声明提前
-使用var关键字声明的变量,会在所有的代码执行之前声明
函数的声明提前;
-使用函数声明形式创建的函数function,函数(){},会在所有代码执行之前就被创建,所以可在函数声明前使用;
-使用函数表达式,不会被声明提前,所以不能在声明之前调用;
var a = fun (){};
-全局作用域的变量都是全局变量,
在页面任意部分都可访问;

函数作用域

—调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁;
—每调用一次函数就会创建一个新的函数作用域,他们之间时互相独立的;
—在函数作用域中可以访问到全局作用域的变量,在全局作用域无法访问到函数作用域的变量;
—挡在函数作用域中操作变量时,他会先在自身作用域,如果没有向上一级作用域找,直至全局作用域,知道报错;
— 在函数访问window对象,可以使用window;
— 在函数作用域中,也有var'的提前声明,函数的提前声明;
— 定义形参就相当于在函数定义var;

使用工厂方法创建对象

—通过该方法可以大批量的创建对象
function creatobj(name,age,gender){
	Var obj = new Object();
	obj.name = name;
	obj.age= age;
	obj.gender = gender;
	return obj

}
var obj2 = creatobj(‘11’,’22’,’nan’);
使用工厂方法创建的对象,使用的构造函数时object,所以创建的对象都是object这个类型,就导致无法区分出多种不同数据类型的对象;
此时,构造函数出现

构造函数

构造函数就是一个普通函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写;
构造函数和普通函数的区别就是调用方式不同,普通函数直接调用,构造函数需要使用new关键字调用;

构造函数函数的执行流程;
1.立即创建一个新的对象;
2.将新建的对象设置为函数中this,在构造函数中使用this
3.逐步执行函数中的代码
4.将新建的对象作为返回值返回;

function Person(name){
this.name = name
}

使用同一个构造函数创建的对象,我们成为一类对象,也是一个构造函数成为类,我们将通过一个构造函数创建的对象,成为时该类的实例;

运算符,instanceof
使用instanceof可以检查一个对象是否是一个类的实例,是返回true,否则false;

** this **
1.当以函数的形式调用时,this是window;
2.当以方法的形式调用时,谁使用方法this就是谁;
3.当以构造函数的形式调用时,this就是新创建的那个对象;
在这里插入图片描述

当将函数直接定义在构造函数中时,每当定义新的实例,都会创建一个新的方法;
性能调优方法,使用上图所示;所有使用共用一个方法;
而将函数定义在全局作用域,会污染全局作用域的命名空间,而且定义在全局作用中也很不安全;
此时原型对象prototype就解决了这种问题

原型对象prototype

我们所创建的每一个函数,解析器都会想函数中添加一个属性prototype;
如果函数作为普通函数调用prototype没有任何作用;
当函数以构造函数的的形式调用时,他所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过__proto__来访问该属性;
function MyClass(){};
var mc = new MyClass();
console.log(mc.proto == MyClass.prototype); //true

原型对象就相当于一个公共的区域,所有同一个实例都可以访问这个原型对象;
我们可以将对象中共有的内容,统一设置到原型对象中;
当我们访问对象的一个属性或则方法时,他会先在对象自身中寻找,如果有则直接使用,若果没有泽会去原型对象中寻找,如果找到则直接使用;
//向MyClass的原型中添加属性a:MyClass.prototype.a = 123’
//向原型属性中添加方法
MyClass.prototype.way()=function(){};

在这里插入图片描述

以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中;这样就不用分别为每个对象添加,也不会影响到全局作用域,就可以使每个对象都有这个属性和方法了;

使用in检查对象中是否含有某个属性时,如果对象中没有,但是原型中有,也会返回true,
console.log(‘name’ in obj);

可以使用对象的hasOwnProperty()来检查对象自身中是否函数某个属性;
Obj.hasOwnProperty(‘name’);
使用该方法,只有该对象自身又该属性时,为true;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

** object对象的原型没有原型**

函数的方法call(),apply()

在这里插入图片描述

this情况

在这里插入图片描述

函数的隐含参数

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值