说到JavaScript的原型和原型链,真是让人头疼的东西,下面就来跟我一起来了解原型和原型链吧!!!!
一.js引用类型皆对象
JavaScript中一切引用类型都是对象
也就是说 数组是对象、函数是对象、对象还是对象
二.什么是原型(prototype)?
1.概念:每个 JavaScript 对象都有一个与之关联的原型对象,通过原型对象,可以实现属性和方法的共享,从而减少内存占用
所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法
简单来说就是为对象提供了继承和共享属性的机制
2.关键词介绍:
prototype是作为对象实例在创建时继承的原型类型而存在的,本质是类型。 改变原型的指向便可以改变继承关系
__proto__为隐式原型,是实例的存取器属性,封装内部对实例属性 [ [Prototype]]的访问,本质是存取器属性
constructor,默认是指向prototype所在的构造函数,constructor会被实例继承。他的作用就是表名某个实例对象是由哪个构造函数产生的
三.原型链
1.自定义对象
function Person() { }
// 实例对象继承了原型的constructor属性,指向自己的构造函数
var p = new Person();
// 构造函数原型对象上的constructor属性指向的也是构造函数,
//p.constructor 和Person.prototype.constructor,指向的是同一个对象
console.log(p.constructor === Person);//true
console.log(Person === Person.prototype.constructor);//true
console.log(p.constructor === Person.prototype.constructor);//true
console.log(p.__proto__ === Person.prototype);//true
上面代码中Person函数为自定义对象(一切皆对象),p为实例化对象
看着下面图片会更容易理解,这就是原型链的其中一个小三角形
2.内置对象(Object)
// 内置对象构造函数的原型链
var obj = new Object();
console.log(obj.__proto__ === Object.prototype);//true
console.log(obj.__proto__.constructor === Object);//true
console.log(Object.prototype.constructor === Object);//true
上面代码中Object为内置对象,obj为实例化对象
看着下面图片会更容易理解,这就是原型链的其中一个小三角形
3.特殊对象(Function)
// 自定义对象
function Person() { }
// 函数构造函数的原型链
var fn = new Function();
// 自己的隐式原型指向自己原型对象
console.log(Function.__proto__ === Function.prototype);//true
// 自己是自己的实例,也可以作为构造函数使用
console.log(fn.prototype.constructor === fn);//true
// Function的原型对象指向Object的原型对象
console.log(Function.prototype.__proto__ === Object.prototype);//true
//所有构造函数都是Function的一个实例
console.log(Function.prototype === Object.__proto__);//true
console.log(Function.prototype === Person.__proto__);//true
上述代码中更详细的说明了Function的原型链
Function是比较特殊的,他的prototype和__proto__都指向Function的原型对象
4.原型链图片
这就是原型链的图片,大家可以联合上面的三个小原型链来理解下面这张图
下图中的自定义对象和内置对象都是Function的实例
Object的原型对象的__proto__指向的是null
还是不理解可以在下方链接进行手动尝试会更加深刻哦~
JavaScript prototype(原型对象) | 菜鸟教程 (runoob.com)
好啦,以上就是我理解的原型和原型链的相关知识说明啦,谢谢大家观看!!!