函数的this指向
解析器(浏览器)每次调用函数都会向函数传递一个隐含的参数,这个参数就是this。
this指向的是一个对象,这对象我们称为函数指向的上下文对象。
根据函数的调用方式的不同,this会指向不同的对象。
普通函数 :
function() {
conole.log(this)
}
对象的方法:
function fn1() {
console.log('Eric')
}
var obj = new Object()
obj.sayname = fn1
调用 : obj.sayname()
总结 : 以函数形式调用,指向window;以方法形式调用---->object (this指向该调用方法所属的对象);
谁调指谁。
构造函数的this指向 新建的对象(实例对象)
工厂模式创建的对象,使用的都是Object构造函数 var obj = new Object();
这就导致无法区分不同种类的对象,类型一样没有区别。(还不是很理解)
构造函数
构造函数就是一个普通函数,与普通函数创建方式一样,但构造函数一般首字母大写。
function Persion (){
}
构造函数与普通函数的区别就是调用方式不同。普通函数时直接调用,而构造函数 ***需要使用new关键字*** (加new为构造函数,不加为普通函数);
var per = new Persion()
构造函数顺序
1) 立刻创建一个对象于堆内存(实例对象)
就像 let obj = new Object()、 let fn = new Function();
2) 将新建对象设为函数中的this,构造函数中的this指向该对象;
3)逐行运行函数中的代码;
4)将新建对象作为返回值返回。
构造函数可以传参
function Persion (name){
this.name = name
}
let per1 = new Persion("Eric")
let per2 = new Persion("Rose")
使用同一构造函数创建的对象称为一类对象,也将一个构造函数叫类。
使用instanceof 可以检查一个对象是否是一个类的实例。
补充: 所有对象都是Object的后代, 任何对象 instanceof Object 都是true;
构造函数的方法
构造函数的方法可放在全局,而不用在构造函数内部创建,就像一个厕所大家用,而不是一人一个厕所。但是这样有一个问题,就是会污染全局作用域。放在全局也不安全,可能两个变量名冲突,也可能被修改,所以不安全。
函数的原型
每个函数都有prototype(原型对象),
无论是普通函数还是构造函数都有这个对象,原型是解析器(浏览器)加的。
每个函数的原型都不一样。
如果函数作为普通函数调用,那么构造函数没有任何作用。
构造函数创建对象(实例对象)的__proto__指向构造函数的原型对象。
__proto__是新建对象的隐含属性。
原型对象
原型对象像一个公共场地,所有该类实例对象都可以访问到这个对象,因此我们可以将对象中共有的内容同一设置到原型对象中。
原型是这一类的原型。
原型对象也是对象,它也有原型。
查找机制
访问一个实例对象的属性或方法时,会现在自身找,如有则直接使用。
没有则回去原型兑现中找,找到则直接使用。
原型中没有找到,就去原型的原型中找,直到Object
hasOwnprototype() 方法
使用in查找对象中有无某个属性,若对象中没有,但原型中有,也会返回true,这样用in就不行了。
mc.hasOwnprototype() 检查自身是否有某个属性,此方法只有对象自身有该属性才会返回true。
mc.__proto__.__proto__ 原型的原型
mc.__proto__.__proto__(Object 总: 它没有原型).__proto__
实例的__proto.____proto__ 第二个就是Object ,它没有原型。
toString()
打印一个对象,相当于打印了 per.toString()
var abc = new Object()
abc.name = "jiji"
console.log(abc)
per.__proto__.__proto__.hasOwnprototype("toString")
若不希望出现 [object Object] ,可以 per.toString() = function () {
console.log('我是大帅哥')
}
将 per.toString() 放于原型更好。
补充: 拼串, +" : " + 或 "+ this.name +" 都可。
垃圾回收
生活时间长了会产生生活垃圾,同理程序运行时间长了也会产生垃圾。这些垃圾过多会让程序运行变慢,因此,我们需要一个垃圾回收机制,来处理
程序运行过程中的垃圾
***什么是垃圾
var obj = new Object()
obj = null
概念: 当一个对象没有任何变量或属性值能对它引用,此时我们永远无法操作该对象! 这种对象就是垃圾,因为它仍占用堆内存空间。
这种对象过多会占用大量内存空间,导致程序运行变慢,甚至内存溢出(卡死程序)---->程序死了。
现代Js有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们无需也不能进行垃圾回收的操作。
** 我们要做的就是 将这些不再使用的的对象 设为 null。