this指向、构造函数


函数的this指向

解析器(浏览器)每次调用函数都会向函数传递一个隐含的参数,这个参数就是thisthis指向的是一个对象,这对象我们称为函数指向的上下文对象。

根据函数的调用方式的不同,this会指向不同的对象。

普通函数 :

function() {
    conole.log(this)  // 指向window
}

对象的方法: 

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()  // console.log(tyepeof(per))   object

构造函数顺序
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 可以检查一个对象是否是一个类的实例。  // console.log(per1 instanceof Persion)  true

补充: 所有对象都是Object的后代, 任何对象  instanceof Object 都是true;
构造函数的方法
构造函数的方法可放在全局,而不用在构造函数内部创建,就像一个厕所大家用,而不是一人一个厕所。但是这样有一个问题,就是会污染全局作用域。放在全局也不安全,可能两个变量名冲突,也可能被修改,所以不安全。
函数的原型
每个函数都有prototype(原型对象),

无论是普通函数还是构造函数都有这个对象,原型是解析器(浏览器)加的。

每个函数的原型都不一样。

如果函数作为普通函数调用,那么构造函数没有任何作用。

构造函数创建对象(实例对象)的__proto__指向构造函数的原型对象。

__proto__是新建对象的隐含属性。
原型对象
原型对象像一个公共场地,所有该类实例对象都可以访问到这个对象,因此我们可以将对象中共有的内容同一设置到原型对象中。

原型是这一类的原型。

原型对象也是对象,它也有原型。
查找机制
访问一个实例对象的属性或方法时,会现在自身找,如有则直接使用。

没有则回去原型兑现中找,找到则直接使用。

原型中没有找到,就去原型的原型中找,直到Object
hasOwnprototype() 方法
使用in查找对象中有无某个属性,若对象中没有,但原型中有,也会返回true,这样用in就不行了。

mc.hasOwnprototype() 检查自身是否有某个属性,此方法只有对象自身有该属性才会返回true。

mc.__proto__.__proto__ 原型的原型  // 一般是两层

mc.__proto__.__proto__(Object 总: 它没有原型).__proto__   // Object没有原型,因此结果为 null

实例的__proto.____proto__ 第二个就是Object ,它没有原型。

toString()
打印一个对象,相当于打印了 per.toString()  // [object Object] 现在似乎不是这样了

    var abc = new Object()
    abc.name = "jiji"
    console.log(abc)  // {name: "jiji"}

per.__proto__.__proto__.hasOwnprototype("toString")   // true

若不希望出现 [object Object] ,可以 per.toString() = function () {
    console.log('我是大帅哥')
}

将 per.toString() 放于原型更好。

补充: 拼串, +" : " +"+ this.name  +" 都可。
垃圾回收
生活时间长了会产生生活垃圾,同理程序运行时间长了也会产生垃圾。这些垃圾过多会让程序运行变慢,因此,我们需要一个垃圾回收机制,来处理

程序运行过程中的垃圾

***什么是垃圾

var obj = new Object()

obj = null // 切断栈空间地址和堆空间内存的联系

概念: 当一个对象没有任何变量或属性值能对它引用,此时我们永远无法操作该对象! 这种对象就是垃圾,因为它仍占用堆内存空间。

这种对象过多会占用大量内存空间,导致程序运行变慢,甚至内存溢出(卡死程序)---->程序死了。

现代Js有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们无需也不能进行垃圾回收的操作。

** 我们要做的就是 将这些不再使用的的对象  设为 null

文章作者: KarlFranz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 reprint policy. If reproduced, please indicate source KarlFranz !
评论
  目录