这是我参与2022首次更文挑战的第3天,活动详情查看:链接
一,认识JavaScript原型
我们所创建的每一个函数,解析器(浏览器)都会向函数中添加一个属性 prototype
这个属性对应这一个对象,这个对象就是我们说的原型,即原型对象。
如果函数作为普通函数调用,prototype 没有任何作用。
当函数通过构造函数使用时,它所创建的对象都会有一个隐含属性指向该构造函数的原型对象,如图:
\
我们可以通过 proto 来访问属性。
原型对象就相当于一个公共区域,所有同一个类的实例都可以访问到这个原型对象(如上图中的 0x123),我们可以将对象中共有的内容统一设置到这个原型对象中,如上 mc ,mc2
二,如何使用原型
向MyClass 的原型中添加属性 a :
MyClass.prototype.a = 123
这个时候,原型对象上如下图:添加了a属性
当我们访问对象的一个属性或者方法的时候,他会在对象自身中寻找,
如果有,直接使用,如果没有,回去原型对象中寻找,找到则直接使用。
如:mc中a不存在,会去MyClass原型对象中寻找。如下图:
例2:
per.a = '我是new出来的per中的a'
//打印 per.a === 我是new出来的per中的a
\
三,原型对象
function Myclass(){
}
var mc = new Myclass()
//向原型Myclass中添加一个name属性
Myclass.prototype.name = '我是原型中的name'
console.log('name' in mc)
#使用in 检查对象中是否含有某个属性时,如果对象中没有但是原型对象中有,也会返回true
#可以使用对象的 hasOwnProperty() 来检查对象自身是否含有该属性
语法: 对象.hasOwnProperty('name')
使用该方法只有当对象自身含有属性时,才会返回true。
如图,当使用hasOwnProperty()检查原型对象 上的属性 parent时,返回flase,这也是 in 和 hasOwnProperty 的区别,
hasOwnProperty 只检查对象本身是否存在该属性,in会往原型对象上查找。
*原型对象也是对象,所以他也有原型
当我们使用一个对象的属性或者方法时,会在自身中寻找,自身中有,则直接使用
如果没有,则去原型对象中寻找,如果原型对象中有,则使用
如果没有,则去原型的原型中寻找,直到找到Object对象原型。
Object对象没有原型,如果在Object中依然没有找到,则返回undefined
四,toString()方法
function Person(name,age,gender){
this.name = name
this.age = age
this.gender = gender
}
var per = new Person('张三',12,'男')
当我们直接在页面中打印一个对象时,实际上输出的是对象的toString()方法的返回值。
如果我们希望在输出对象时,不输出【Object,Object】,可以为对象添加一个toString()方法
例如:
per.toString = function(){
return '重新处理的文本'
}
上面说到,要使得构造出来的对象都共用一个方法,我们可以对Person原型进行修改
Person.prototype.toString = function(){
...code...
}
五,垃圾回收机制(GC)
程序运行过程中也会产生垃圾,过多的垃圾会导致运行过慢。
JavaScript中,浏览器的垃圾回收机制,处理程序运行中产生的垃圾
如图:当obj的值变为null之后,没有任何变量或者属性对0x123 这个对象进行引用,此时,我们将永远无法操作该对象,所以我们称之为垃圾对象。
这种对象过多会占用内存空间,导致程序运行过慢,所以这种垃圾对象必须清理。
在JavaScript中拥有自动的垃圾回收机制,会将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收。
我们需要做的就是,只要将不在使用的对象设置为null即可。