什么是原型
原型也称原型对象.每个构造函数都有其对应的原型对象。 获取原型对象的方式:构造函数名.prototype。
js为什么会有原型(prototype)?
首先JavaScript中的原型(prototype)概念是为了解决以下问题而引入的
1.避免重复创建方法
当使用构造函数创建多个对象时,如果每个对象都包含相同的方法,那么这些方法会被每个对象各自复制一份,导致内存浪费.原型允许所有对象共享同一个方法的引用,提高了性能和内存使用效率. 代码示例:
//不使用原型创建对象,F生成的每个实例都会创建getkey方法
function F(){
this.getKey=function(){
return '9';
}
}
var fn=new F();
console.log(fn.getKey());
//使用原型创建对象,P生成的每个实例不需要创建getkey方法,调用的是原型对象的getKey方法
function P(){
}
P.prototype.getKey=function(){
return 'prototype';
}
var fp=new P();
console.log(fp.getKey());
2、实现继承
原型链是实现继承的关键机制。通过将属性和方法定义在构造函数的原型对象中,子构造函数的实例可以继承父构造函数的属性和方法,从而实现了类似传统面向对象编程中的继承效果
代码示例
//原型链继承
function Parent(){
this.isShow=true;
this.info={
name:'fhy',
age:26,
};
}
Parent.prototype.getInfo=function(){
console.log(this.info);
console.log(this.isShow);
}
function Child(){
};
Child.prototype=new Parent();
let child1=new Child();
console.log(child1);
child1.info.gender='女';
child1.getInfo();
let child2=new Child();
console.log(child1);
child2.isShow=false;
console.log(child2.info.gender)
child2.getInfo();
3、简化语言设计
javascript的设计者在创建语言时考虑到了简洁性和易用性.通过引入原型机制,可以在不引"类"的概念的情况下,实现对象的共享属性和方法的继承,从而简化了语言设计
4、支持动态扩展
javascript的原型机制支持对象的动态扩展,这意味着可以在运行时向对象的原型中添加新的属性和方法,从而影响所有基于该原型创建的实例
显示原型和隐式原型
每个函数都有一个prototype,即是显示原型,每个实例对象都有一个__proto__,可称为隐式原型.对象的隐式原型的值为其对应的构造函数显示原型的值. 总结:函数的prototype属性:在定义函数时自动添加的,默认是一个空object对象 对象的__proto__属性:创建实例对象时自动添加的,默认值为构造函数的prototype属性值 程序员能直接操作显示原型,但不能直接操作隐式原型(Es6之前) 图解
原型链(别名:隐式原型链)
访问一个对象的属性时,先在自身属性上查找,找到返回
如果没有,再沿着__proto__这条链向上查找,找到返回
如果最终没找到,返回undefined
作用:查找对象的属性(方法) 图解