对象的构造函数修改
问题描述:
当我们用构造函数创建对象的时候,构造函数中的属性在我们每次创建对象的时候都会再次创建,但是如果某一个属性是我们所有对象共有的,即意思是这个属性我们所有的对象都相同
如下:
看这里明明同样功能的函数,却因为创建了两个对象而被创建了两次,搞得这两个对象的同功能函数也不相同,这样会非常占内存,我们不需要这些属性多次创建
方法一:
把相同的属性设置为全局作用域
我们设置全局作用域的函数,把它传给构造函数的一个属性,然后用这个构造函数创建的对象都会用这个共同的全局作用域函数,这样我们创建对象的时候就不会每次都创建这个函数了,看下面的控制台信息就知道这俩属性是一个相等的
注意:
在我们开发过程中,尽量避免全局作用域属性的定义和使用,因为全局作用域会带来很多问题
所以我们就要用到第二个方法了
方法二:
用函数自带的prototype属性
原型对象(prototype属性)
什么是原型对象?
在我们创建函数中,每创建一个函数(只要是个函数),解析器都会自动向函数中添加一个属性prototype
,这个属性指向我们的原型对象,然后我们用这个函数创建对象的时候,每个对象都会有这个属性,他们都指向同一个对象,即原型对象。原型对象就相当于一个公共区域,所有的同一个类的实例(对象)都可以访问到这个原型对象
来看看我们的李立超老师的图:
右边的0x123代表的是地址
作用:
因为所有的对象的这个属性都是指向同一个对象,所以我们可以用这个来设置一些对象的共有属性,防止这些属性随着对象的创建而被多次创建浪费空间,也不会影响到全局作用域
使用方法:
在函数中我们需要通过prototype
来访问设置这个对象
语法:函数名.prototype.设置的属性名
在对象中我们可以通过__proto__
来访问这个对象
语法:函数名.__proto__.设置的属性名
注意,两边是两个下划线
看下面实例
第8行设置原型对象的属性a,后面第15行判断类创建的对象中的两个属性是否相同,第13和17行打印我们原型对象中的a属性,可以看到我们这里的两个对象的a是同一个属性,所以就避免了创建多余的属性,节省空间
当我们用类创建了某个对象后,我们也可以直接对象名.原型对象属性
这样来调用其中的属性,如下
但是这样调用的话不是每次都能精准调用我们的原型对象的属性的
注意我们类创建的实例调用属性的顺序
当对象的属性名和原型对象中的属性名重复了的时候我们对象.属性名
会先调用对象中的属性。
原型对象的的原型对象
原型对象也是对象,他也可能有自己的原型对象,我们使用的对象自带的某些函数就是在对象的原型对象的原型对象中,比如hasOwnProperty()
函数(hasOwnProperty()
函数的知识看这:地址链接)但不是所有的原型对象都有原型对象比如上图的obj.__proto__
这个对象就没有原型对象的原型对象
对象.属性名
这个方法调用对象属性的时候他会先判断自身有没有这个属性,有的话会先用这个,没有的话会一级一级的向上层的原型里面寻找,直到找到所有对象的老祖宗Object
对象,所有的对象最上层的原型对象就是Object