JavaScript踩坑笔记06---原型对象、prototype、隐式原型、__proto__、原型链

原型、prototype:

每个函数都有一个prototype属性,这个属性就是原型,它指向该函数对应的原型对象。这个对象包含由该函数创建的所有实例共享的属性和方法。
举例说明。

// 定义一个函数fn
function fn() {}

// 创建函数fn的实例
var fn1 = new fn();

// 没有找到实例fn1中的属性name,所以为未定义
console.log(fn1.name); // undefined
// 没有找到实例fn1中的方法show,所以报错
fn1.show(); // TypeError: fn1.show is not a function

// 给函数fn的原型对象添加一个属性name
fn.prototype.name = "原型对象下面的一个属性";
// 给函数fn的原型对象添加一个方法show
fn.prototype.show = function () {
	console.log("Hello");
};

console.log(fn1.name); // 原型对象下面的一个属性
fn1.show(); // Hello

// 再创建一个函数fn的实例
var fn2 = new fn();

console.log(fn2.name); // 原型对象下面的一个属性
fn1.show(); // Hello

由以上例子说明,在函数的原型对象下添加属性和方法,会给由该函数创建的所有实例添加相同的对象和方法。
每个原型对象都有一个constructor属性,它指向该原型对象对应的函数。
也就是说,函数、原型对象之间的关系,是一个环形关系。
画图说明。
在这里插入图片描述

隐式原型、proto

每一个对象都有一个__proto__属性,这个属性就是隐式原型,它指向创建该对象的构造函数对应的原型对象。所以给原型对象添加属性和方法,那么它对应的实例也会添加属性和方法。
画图说明。
在这里插入图片描述

原型链:

原型链指的是,各个原型对象关系的一条链路。
原型对象也是对象,所以它也有__proto__属性,它是由Object创建的,所以它的__proto__指向Object.prototype。
函数也是对象,所以它也有__proto__属性,它是由Function创建的,所以它的__proto__指向Function.prototype,而函数Function的__proto__指向的是Function对象。
画图说明。
在这里插入图片描述
由上图说明,所有的原型对象最终都会直接或间接的指向Object.prototype,所有的函数最终都会直接或间接的指向Function.prototype,而Function.prototype最终也会指向Object.prototype,而Object.prototype指向的是null。
总结一下,在面向对象的编程中,“万物皆对象”这句话一点都没错。
但是在JavaScript中,“空即是对象,对象即是空”,这是JavaScript的编程哲学。


个人学习总结,欢迎批评指正

猜你喜欢

转载自blog.csdn.net/qq_43738157/article/details/84537962
今日推荐