首页 > 语言 > JavaScript > 正文

javascript 原型与原型链的理解及应用实例分析

2024-05-06 15:44:19
字体:
来源:转载
供稿:网友

本文实例讲述了javascript 原型与原型链的理解及应用。分享给大家供大家参考,具体如下:

javascript中一切皆对象,但是由于没有Class类的概念,所以就无法很好的表达对象与对象之间的关系了。

比如对象A与对象B之间,它们两个是相对独立的个体,互不干扰,对象A修改自身的属性不会影响到对象B。

虽然这很好,但是有一个问题,如果对象A与对象B都有一个方法 run() ,并且代码也一样,那对象A与对象B各自都独立拥有一份 run() 方法的完整代码,这是需要资源去保存的。

一旦我们程序中应用的对象过多,那这种资源消耗会是巨大的。那有没有一种方法可以让对象A与对象B拥有一些公共的属性和方法,让它们之前有某种联系?

我们设想一下,会不会存在一个 common对象(公共对象),common对象上保存着公共的属性和方法,而对象A与对象B里面有一个prototype属性指向这个 common对象,

当然我们调用对象A或对象B的属性和方法时,如果在自身对象中没有找到,就去prototype这个属性指向的对象上面去找。

而common对象本身也有一个prototype属性指向更上一级的common对象,然后一直往上找啊找,直到为null,就停止。

这种不断的从下往上找的这种路径,就像链条一样,我们称它为 原型链,而那个common对象,我们称它为 原型对象。

我们来看一个构造函数

function Base(name) {  this.name = name;}let A = new Base('A');let B = new Base('B');//每一个函数都有一个prototype属性,指向该函数的原型对象console.log(Base.prototype);//当然原型对象也是一个对象,它也有一个constructor,指向构造函数console.log(Base.prototype.constructor === Base);//每一个实例对象的constructor都指向创建它们的构造函数console.log(A.constructor === Base);console.log(B.constructor === Base);//每一个实例对象都有一个__proto__属性,该属性指向构造函数的原型对象console.log(A.__proto__ === Base.prototype);console.log(B.__proto__ === Base.prototype);

1、每一个函数都有一个prototype属性,它指向该函数的原型对象。

2、原型对象也是对象,它也有自已的constructor,它指向构造函数Base()。换句话说,其实原型对象也是构造函数Base()的一个实例。只不过比较特殊,用来存放公共属性和方法的。

3、每一个通过构造函数Base()创建的实例对象,都有一个constructor,指向创建它们的构造函数。

4、每一个对象,都有一个 __proto__ 属性,指向构造函数Base()的 原型对象。换句话说,__proto__ 是将 原型 串联起来形成链条的关键。不然对象A与对象B都无法找到原型对象上的公共属性和方法。

function Base(name) {  this.name = name;}//我们在原型对象上添加公共属性Base.prototype.status = '开始';//我们在原型对象上添加公共方法Base.prototype.run = function() {  console.log(this.name + ' run ...');};let A = new Base('A');let B = new Base('B');A.run();B.run();console.log(A.status);console.log(B.status);//修改原型上的属性,则实例对象也会跟着改变Base.prototype.status = '停止';console.log(A.status);console.log(B.status);            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选