资讯专栏INFORMATION COLUMN

浅谈 JavaScript 原型链

explorer_ddf / 1592人阅读

摘要:数组的构造函数是原型链的指向与其他除以外的构造函数相同,的也指向顶级原型对象,每一个数组都是的实例,都指向。实例对象查找构造函数原型对象的方法一般会把对象共有的属性和方法都放在构造函数的原型对象上。

阅读原文


概述

在 JavaScript 中有种说法叫 “万物皆对象”,就是说无论是构造函数创建的实例,构造函数本身、原型对象、数组、函数本质上都是对象,都拥有 __proto__ 属性,即隐式原型,所有函数都拥有 prototype 属性,即显式原型(仅限函数),原型对象(prototype 属性指向的对象),在定义函数时就被创建。

原型链指向概述

在 JavaScript 中整个原型链及查找机制用下图可以完整的表示出来:

原型链指向:

1、通过字面量和 new Object() 所创建的对象,他们是构造函数是 function Object() 的实例,Object 构造函数的 prototype 指向原型对象 Object.prototypeObject.prototypeconstructor 指向构造函数 Object,而实例的 __proto__ 也指向 Object.prototypeObject.prototype__proto__ 指向 null,所以 Object.prototype 也叫做顶级原型对象。

2、上图中 new Foo() 创建的对象是构造函数 function Foo() 的实例,Fooprototype 指向原型对象 Foo.prototypeFoo.prototypeconstructor 指向构造函数 Foo,而实例的 __proto__ 也指向 Foo.prototype,并且 Foo.prototype 虽然是原型对象,但也是对象,所以是构造函数 Object 的实例,__proto__ 指向顶级原型对象 Object.prototype

3、数组的构造函数是 function Array() 原型链的指向与其他除 Object 以外的构造函数相同,Array.prototype__proto__ 也指向顶级原型对象 Object.prototype,每一个数组都是 Array 的实例,__proto__ 都指向 Array.prototype

4、ObjectArrayFoo 等构造函数的本质也是对象,他们的构造函数是 function Function()Functionprototype 指向 Function.prototypeFunction.prototypeconstructor 指向 Function,所有的构造函数的 __proto__ 都指向 Function.prototype,包括 Function 本身,也就是说构造函数 Function 是由自己构造的,Function.prototype__proto__ 同样指向顶级原型对象 Object.prototype

prototype 原型对象

prototype 是函数的一个属性,属性的值指向了一个对象,所以,只有函数才有 prototype 原型对象。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

typeof Person.prototype; // object
Person.prototype.constructor; // Person {}
Person.prototype.job = "qianduan";

var p1 = new Person("panda", 18);
var p2 = new Person("shen", 20);

p1.constructor.prototype; // 实例对象查找构造函数原型对象的方法

一般会把对象共有的属性和方法都放在构造函数的原型对象上。

实例、构造函数、原型对象的关系

构造函数的原型 prototype 属性指向一个原型对象,实例也可以通过 __proto__ 指向原型对象,但本质上实例和构造函数之间是没有关系的。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

var p = new Person("nihao", 16);
p.constructor = { name: "haha" };
p.name; // nihao

上面的代码中改变了构造函数的值为一个对象,对象中的属性 name 并没有影响实例的 name 属性值。

实例属性 __proto__

上面访问实例 p 的原型,实际使用 p.constructor.prototype 去找原型对象,当构造函数的值改变后是找不到原型对象的,所以实例并不是通过 constructor.prototype 去查找原型对象的,而是通过每一个实例都有的 __proto__ 属性,这个属性指向创建实例的构造函数原本的原型对象,这个属性不是标准,在 IE 下不存在。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.job = "qianduan";
var p = new Person("nihao", 16);

p.__proto__.job; // qianduan

当构造函数的 prototype 属性值被改变之后,在之前创建的实例的 __proto__ 属性值的仍然引用原型对象,所以对构造函数改变前创建的实例是没有影响的,会影响后面创建的实例。

原型链查找机制

实例对象在调用了一个属性或方法时,如果对象本身没有这个属性或方法,会去自己的原型对象查找,也就是 __proto__ 中查找,如果原型对象中没有,去原型对象的原型对象查找,一般(原型链没有被修改)情况下就是去 __proto____proto__ 中查找,即顶级原型对象 Object.prototype,如果实例对象本身有这个属性,则直接输出,不再向上查找,如果对象本身和原型对象具有同名属性,则会屏蔽掉原型对象的属性。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.job = "qianduan";
var p = new Person("nihao", 16);

p.job; // qianduan
p.job = "houtai";
p.job; // houtai
p.__proto__.job; // qianduan
总结

原型链的指向及原型链的查找机制是 JavaScript 中非常重要的基础知识,理解原型链是更深入了解继承和面向对象编程的必经之路。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98288.html

相关文章

  • 浅谈JavaScript原型

    摘要:在这其中我们就逃不开要讨论继承原型对象构造函数实例了。想要获得某一类型的构造函数可以用来获得,也可以对该属性进行赋值操作。三上面就提到一点是指构造函数的原型对象,它是一个对象,它是构造函数的属性。 原型链这一个话题,需要和很多概念一起讲,才能串成一个比较系统的知识点。在这其中我们就逃不开要讨论继承、原型对象、构造函数、实例了。 一、构造函数 构造函数是一类特殊的函数,它的作用是用来生成...

    xumenger 评论0 收藏0
  • 浅谈JavaScript原型原型

    摘要:在讲原型之前,先简单介绍一下几个概念构造函数例如上述代码创建的函数就被称为构造函数。同一个构造函数实例化得到的多个对象具有相同的原型对象,所以经常使用原型对象来实现继承。实例对象通过操作构造函数所创建的对象是实例对象。 对于很多前端开发者而言,JavaScript的原型实在是很让人头疼,所以我这边就整理了一下自己对应原型的一点理解,分享给大家,供交流使用 原型 说起原型,那就不得不说p...

    Zoom 评论0 收藏0
  • 浅谈JavaScript原型原型

    摘要:在讲原型之前,先简单介绍一下几个概念构造函数例如上述代码创建的函数就被称为构造函数。同一个构造函数实例化得到的多个对象具有相同的原型对象,所以经常使用原型对象来实现继承。实例对象通过操作构造函数所创建的对象是实例对象。 对于很多前端开发者而言,JavaScript的原型实在是很让人头疼,所以我这边就整理了一下自己对应原型的一点理解,分享给大家,供交流使用 原型 说起原型,那就不得不说p...

    Yang_River 评论0 收藏0
  • 浅谈javascript原型原型

    摘要:在中,主要有两种创建对象的方法分别是对象字面量以及调用构造函数对象字面量调用构造函数其实上述两种创建对象的方法,本质上是一样的,都是引擎调用对象的构造函数来新建出一个对象。 原型与原型链是javascript里面最最核心的内容,如果不能理解它们之间的存在关系的话,那么我们是不能理解这门语言的。 在JS中,主要有两种创建对象的方法, 分别是对象字面量以及调用构造函数 //对象字面量 va...

    includecmath 评论0 收藏0

发表评论

0条评论

explorer_ddf

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<