首页 > 试题广场 >

JavaScript 原型及原型链

[问答题]
JavaScript 原型,原型链 ? 有什么特点?

https://www.cnblogs.com/shuiyi/p/5305435.html
链接的博客解释原型和原型链挺清楚,用三张图来说明。
图片说明
图片说明

发表于 2018-03-09 16:39:41 回复(0)
原型:实例对象原型(_proto_)和构造函数原型(prototype),实例对象原型指向构造函数原型
原型链:是一种关系,实例对象和原型对象的关系,关系是通过原型_proto_来构建
发表于 2020-03-20 16:43:23 回复(0)
对象都有隐式原型__proto__。
函数有显示原型prototype。
对象的__proto__指向其构造函数的prototype。
对象查找一个属性,当前自身属性没有时会一层层往父级的proto里找,这个查找形成的链叫做原型链
发表于 2020-04-04 00:11:46 回复(0)
了解原型,原型链需要了解 原型对象 构造函数 实例三者之间的关系
原型 每个对象(Person)都会有一个原型对象,对象的实例(p1)包含一个隐式的指针指向原型对象p1.__propo__ ===     Person.prototype
原型链如图所示
特点(摘自红宝书,第6章):
1 原型链之间为引用关系,因此对象实例共享所有的属性和方法,在原型链中的引用类型,因此不适宜单独使用,解决这个问题是利用构造函数,在子类构造函数的内部调用超类的构造函数 (Person.call(this, name,,)),这样可以做到每个实例都具有自己的属性,同时还能保证只是用构造函数模式来定义类型。
2 对象可以在编码执行过程中创建和增强,因此具有动态性而非严格定义的实体。
编辑于 2017-06-30 17:35:32 回复(0)
**1.什么是原型,原型有什么特点:**

JavaScript 的每个对象都继承另一个对象,后者称为“原型”(prototype)对象。只有null除外,它没有自己的原型对象。

使用原型的好处是:原型对象上的所有属性和方法,都能被对应的构造函数创建的实例对象共享(这就是 JavaScript 继承机制的基本设计),也就是说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。

每一个构造函数都有一个prototype(原型)属性,这个属性就是使用构造函数创建出来的实例对象的原型对象。

**2.什么是原型链,原型链有什么特点**

对象的属性和方法,有可能是定义在自身,也有可能是定义在它的原型对象上。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。

如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype,即Object构造函数的prototype属性指向的那个对象。而Object.prototype对象的原型就是没有任何属性和方法的null对象,而null对象没有自己的原型。

“原型链”的作用是,读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。

如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overriding)。

需要注意的是,一级级向上,在原型链寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链。




发表于 2017-11-12 13:16:17 回复(0)
1. JavaScript 原型:每一个构造函数都有一个显式原型属性,也就是prototype属性,它的值默认是一个空对象,每一个实例对象都有一个隐式原型__proto__属性,它指向显式原型对象。这样的好处是每一个实例都可以访问到prototype对象里面定义的方法,而不会重复去创建函数。
2. 原型链的作用就是去查找属性。当查找一个实例对象的属性时,我们首先在实例对象自身去查找,如果没有找到,就沿着__proto__这个属性到原型对象里面去查找,直到找到为止,原型链的末端是Object.prototype,因为它的__proto__属性的值为null。

发表于 2021-07-29 19:53:28 回复(0)
对象都有隐式的原型_proto_,函数都有一个显示的原型prototype。原型对象也是有自己的原型,当这个原型对象的原型不为null,我们称之为原型链
发表于 2020-12-27 20:54:36 回复(0)
所有对象的__proto__都指向它构造器的原型(prototype),每个对象的都有一个constructor属性获取它对应的构造器。
发表于 2020-11-02 20:38:51 回复(0)
每一个函数都有原型prototype,每一个对象都有属性__proto__
原型prototype上属性和方法是实例共享的。而__proto__指向的是其所属类的原型prototype。
原型链其实是一种机制。当我们实例调用某个方法的时候,我们会先查找自己身上是否有,有的话使用自身的。如果没有,则沿着__proto__属性查找其所属类的prototype原型上是否有,有则使用,没有则继续查找。所以这种沿着__proto__一层层向上查找的机制就是原型链。
发表于 2020-05-27 16:24:27 回复(0)

每个对象都有一个内部属性prototype(原型),我们称之为原型,原型的值可以是一个对象,也可以是null,如果它的值是一个对象,那么这个对象也有自己的prototype,这样就构成了一个线型的链,即原型链。原型链是由一些用来继承和共享属性的对象组成的对象链。

发表于 2019-10-15 16:15:40 回复(0)
特点:原型链实现了继承 原型链存在两个问题: a 包含引用类型值的原型属性会被所有实例共享 b在创建子类型时 无法向超类型的构造函数中传递参数 原型链:每个继承父函数的子函数的对象都包含一个内部属性proto 该属性包含一个指针 指向父函数的prototype 若父函数的原型对象的proto属性为再上一层函数 在此过程中就形成了原型链 原型:在JavaScript中 一共有两种类型的值 原始值和对象值每个对象都有一个内部属性[[prototype]]我们通常称之为原型
发表于 2019-05-03 22:22:24 回复(0)

每个对象都会在其内部初始化一个属性,就是 prototype( 原型 ) ,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去 prototype 里找这个属性,这个 prototype 又会有自己的 prototype

于是就这样一直找下去,也就是我们平时所说的原型链的概念。

关系: instance.constructor.prototype = instance.__proto__

发表于 2017-04-13 10:47:47 回复(0)
1. 原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链
2. 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链
发表于 2015-07-27 15:38:04 回复(0)