原型和原型链的区别,__proto__和prototype的区别

2024-03-14 04:52
文章标签 proto 区别 prototype 原型

本文主要是介绍原型和原型链的区别,__proto__和prototype的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在JavaScript中,每个对象都有一个原型(prototype),原型是一个对象,它包含共享属性和方法的对象。JavaScript使用原型链(prototype chain)来实现对象之间的继承关系。

区别如下:

1. 原型(prototype):

原型是每个对象都具有的属性,它指向另一个对象,用于共享属性和方法。每个对象都有一个原型,通过__proto__属性访问。

2. 原型链(prototype chain):

原型链是一种对象之间的连接方式,它由每个对象的原型构成。当访问一个对象的属性或方法时,如果对象本身没有该属性或方法,JavaScript会沿着原型链向上查找,直到找到或者到达原型链的顶端(通常是Object.prototype)。这样就实现了对象之间的属性和方法继承。

简而言之,原型是对象自身具有的属性,用于共享属性和方法。原型链是对象之间通过原型连接起来的链式结构,用于属性和方法的继承。

举个例子来说明:

// 定义一个对象
const person = {name: 'John',age: 30,
}// person 对象的原型是 Object.prototype
console.log(person.__proto__ === Object.prototype) // true// Object.prototype 的原型是 null
console.log(Object.prototype.__proto__ === null) // true

在上述例子中,person对象的原型是Object.prototype,而Object.prototype的原型是null。当我们访问person对象的属性时,如果该属性不存在于person对象本身,JavaScript会通过原型链查找,最终在Object.prototype中找到。

总结起来,原型(prototype)是对象自身具有的属性,用于共享属性和方法;原型链(prototype chain)是对象之间通过原型连接起来的链式结构,用于属性和方法的继承。

__proto__prototype是JavaScript中的两个不同的概念,它们有着不同的作用和用法。

  1. __proto__(双下划线proto)是每个对象都具有的内部属性,用于访问该对象的原型(prototype)。它是一个非标准的属性,但被现代浏览器广泛支持。

    • 通过obj.__proto__可以访问对象的原型。
    • __proto__提供了一种从对象到原型的直接链接。

    例如:

    const obj = {};
    console.log(obj.__proto__); // 输出: {}
    

    在使用ES6之前,__proto__是访问和设置对象原型的主要方式。然而,它已经被Object.getPrototypeOf()Object.setPrototypeOf()方法所取代,推荐使用这些方法来操作对象的原型。

  2. prototype是函数对象(构造函数)特有的属性。它是一个指向原型对象的属性,用于定义构造函数创建的对象的共享属性和方法。原型对象是构造函数通过new关键字创建的实例对象的原型。

    • prototype是函数对象的一个属性,用于定义构造函数的原型对象。
    • 通过构造函数创建的实例对象通过__proto__属性链接到构造函数的prototype属性所指向的原型对象。

    例如:

    function Person() {}
    console.log(Person.prototype); // 输出:Person {}const person = new Person();
    console.log(person.__proto__); // 输出:Person {}
    

    prototype属性用于在构造函数中定义方法和属性,这些方法和属性可以被通过该构造函数创建的实例对象所共享。

总结起来:

  • __proto__是每个对象都具有的内部属性,用于访问该对象的原型。
  • prototype是函数对象特有的属性,用于定义构造函数创建的对象的共享属性和方法。

请注意,虽然在现代JavaScript中__proto__prototype仍然存在,但由于历史遗留原因和不规范的使用,推荐使用更标准的方法来操作对象的原型,如Object.getPrototypeOf()Object.setPrototypeOf()Object.create()

这篇关于原型和原型链的区别,__proto__和prototype的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807246

相关文章

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以