原型和原型链

一、关于构造函数

构造函数和普通函数本质上没什么区别,只不过使用了new关键字创建对象的函数,被叫做构造函数。构造函数的首字母一般是大写,用来区分普通函数。(不大写也不会报错)
示例:

function Person(name,age){
this.name = name;
this.age = age;
this.species = '人类';
this.say =function(){
console.log("Hello");
}
}
/**声明一个对象:*/
let person = new('xiaoming','12');

二、关于原型对象

在js中,每一个函数类型的数据,都有一个叫做prototype的属性,这个属性指向的是一个对象,就是所谓的原型对象。
对于原型对象来说,它有一个constructor属性,指向它的构造函数
Person().prototype ----> Person.prototype
Person.prototype.constructor ----> Person()
原型对象最主要的作用是用来存放实例对象的公有属性和共有方法。
上边的实例中,species属性和say方法对于所有实例来说都一样,放在构造函数中,那每创建一个实例,就会重复创建一次相同的属性和方法,显得有些浪费,这时候,如果把这些公有的属性和方法放在原型对象中共享,就会好很多。

function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.species = '人类';
Person.prototype.say = function(){
console.log("Hello");
let person1 = new Person('张三',20);
console.log(person1.species);//人类
person1.say();//hello
}

这里的species属性和say方法并不是实例对象自己的方法和属性,而是原型对象中的属性和方法。对象如果在自己的这里找不到对应的属性或者方法,就会查看构造函数的原型对象,如果上面有这个属性或方法,就会返回属性值或调用方法。我们可以通过person1.constructor查看对象的构造函数

console.log(person1.constructor);//Person()

这个constructor是原型对象的属性,在这里能被实例对象使用。如果原型对象上也没有找到想要的属性,就要说到原型链了。

三、原型链

显示原型:利用prototype属性查找原型,只是这个函数类型数据的属性。
隐式原型:隐式原型是利用_proto_属性查找原型,这个属性指向当前对象的构造函数的原型对象,这个属性是对象类型数据的属性,所以可以在实例对象上面使用。
let person1 = new Person("xiaoming",12);
person1._proto_ === Person.prototype
原型链:
_proto_这个属于对象类型的属性,而原型对象也是对象,那么原型对象就也有这个属性
原型对象的这个属性指向Object.prototype即有以下关系
Person.prototype._prototype_=Object.prototype
Object.prototype._prototype_=null
像这样顺着_proto_属性,一步一步网上查找,形成了像链条一样的结构,这个结构就叫做原型链,所以,原型链也叫做隐式原型链。

posted @   生活的样子就该是那样  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示