JavaScript中原型的存在很大程度上是对于内存的节省,因为如果JavaScript中没有原型的设定,就会有大量的方法根据实例的创建而创建,而很多的方法是该实例并不需要的但依然会被创建,每一个方法的创建都会开辟一个新的空间,这是对内存的极大消耗。
所以方法只存在于构造函数中,哪一个实例需要再去创建的想法就产生了,进而出现了原型这个概念
构造函数通过原型分配的函数是对所有对象共享的,不用再单独开辟内存空间了。
每一个构造函数内部都有一个prototype对象,我们需要把那些不变的方法放到这个prototype中,在通过实例调用这个方法的时候,这个方法只会创建一个,不会随着实例的创建而创建,大大节省了内存
function Person(uname,age){
this.uname = uname;
this.age= age;
//将方法放到原型对象中
Person.prototype.sing = function(){
console.log('会唱歌')
}
}
var lyq = new Person()
var kcy= new Person()
//说明指向的是同一个地址
console.log(lyq.sing() ===kcy.sing() )//返回true
再解释一下为什么创建的实例都能找到这个存储在prototype中的方法:
因为每一个创建的实例中有一个__proto__属性(这个属性是自动添加的),这个属性指向的就是构造函数中的prototype,正是因为这个__proto__的存在所以实例们才能找到prototype中的方法
在prototype与__proto__中有一个同样的属性constructor,这个属性是为了指明当前对象是引用了哪一个构造函数