Javascript中prototype与__proto__的关系详解

下面我来为大家讲解“Javascript中prototype与__proto__的关系详解”。

1. 什么是prototype

prototype是Javascript中的一个属性,每一个函数都会默认拥有prototype属性。prototype属性指向一个对象,这个对象中包含了一些属性和方法,这些属性和方法可被该构造函数的实例对象共享。也就是说,当使用new运算符创建该构造函数的一个实例对象时,实例对象会继承该构造函数的prototype属性上所定义的属性和方法,从而实现代码的重用。

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

Person.prototype.sayName = function () {
  console.log("My name is " + this.name);
};

let person1 = new Person("Tom", 18);
person1.sayName(); // My name is Tom

在上面的示例中,我们定义了一个Person构造函数,并在其prototype属性上添加了一个sayName方法。接着我们通过new运算符创建了一个person1实例对象,并调用了其sayName方法,发现成功输出了"My name is Tom"字符串。

2. 什么是__proto__

__proto__是Javascript中的一个特殊属性,也称为原型链。每个对象(除null以外)都有一个__proto__属性,它指向该对象的原型(prototype)。通过原型链,一个对象可以访问和使用其原型(prototype)上所定义的所有属性和方法。

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

Person.prototype.sayName = function () {
  console.log("My name is " + this.name);
};

let person1 = new Person("Tom", 18);

console.log(person1.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__); // {}

Object.prototype.toString.call(Person.prototype.__proto__); // "[object Object]"

在上面的示例中,我们使用__proto__属性来验证person1实例对象的原型(prototype)是否为Person函数的prototype属性,发现结果为true。接着我们使用__proto__属性查看Person函数的prototype属性的原型(prototype),发现为一个空对象。最后我们使用Object.prototype.toString方法查看空对象的类型,发现为"[object Object]"。

3. prototype与__proto__的关系

每个函数都有一个prototype属性,它指向一个对象(即该函数的原型)。通过原型链,每个实例对象都可以访问和使用该函数prototype属性上所定义的属性和方法。而每个对象(除了null以外)都有一个__proto__属性,它指向该对象的原型(prototype)。通过原型链,每个实例对象都可以访问和使用其原型(prototype)上所定义的所有属性和方法。

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

Person.prototype.sayName = function () {
  console.log("My name is " + this.name);
};

let person1 = new Person("Tom", 18);

console.log(person1.__proto__ === Person.prototype); // true
console.log(Person.prototype.constructor === Person); // true
console.log(person1.constructor === Person); // true

在上面的示例中,我们创建了一个Person函数,并在其prototype属性上添加了一个sayName方法。接着我们使用new运算符创建了一个person1实例对象,验证了person1实例对象的__proto__属性与Person函数的prototype属性是否指向同一个对象,发现结果为true。接着我们分别验证了Person函数的prototype属性的constructor属性和person1实例对象的constructor属性是否均指向Person函数,发现结果均为true。

总结

通过本文,我们详细讲解了Javascript中prototype与__proto__的关系。每个函数默认都会拥有prototype属性,它指向一个对象(即该函数的原型),而每个对象(除了null以外)都拥有一个__proto__属性,它指向该对象的原型(prototype)。我们还通过示例详细说明了函数的原型和实例的原型如何在原型链中连接起来,并进一步解释了原型链的概念。掌握了这些知识,有助于我们更好地理解Javascript的面向对象编程特性,更加灵活地开发出高效的Javascript程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript中prototype与__proto__的关系详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 苹果官方发布Xcode7开发者测试Beta6版下载

    苹果官方发布Xcode7开发者测试Beta6版下载 简介 Xcode 7是苹果公司的一款集成开发环境,是开发OS X、iOS、watchOS和tvOS应用程序的首选工具。Xcode 7提供了Swift 2编程语言的全新特性和改进,包括更快的编译速度、开发GUI应用程序和游戏的新工具,以及iOS和watchOS应用扩展的新框架。 下载流程 步骤一 : 登录苹果…

    other 2023年6月26日
    00
  • Nginx基础学习之realip模块的使用方法

    Nginx基础学习之realip模块的使用方法 简介 在Nginx中,realip模块用于获取真实客户端的IP地址。当Nginx作为反向代理服务器时,客户端的IP地址会被代理服务器的IP地址所替代。realip模块可以解决这个问题,将真实的客户端IP地址还原出来。 安装和配置 首先,确保你已经安装了Nginx。如果没有安装,可以参考Nginx的官方文档进行安…

    other 2023年8月21日
    00
  • 详解Mysql 游标的用法及其作用

    详解MySQL游标的用法及其作用 MySQL游标是一种用于在数据库中遍历结果集的机制。它允许我们在查询结果集中逐行移动,并对每一行执行特定的操作。本文将详细介绍MySQL游标的用法及其作用。 游标的基本用法 声明游标 在使用游标之前,我们需要先声明一个游标变量。游标变量的声明通常在存储过程或函数的开头部分进行。下面是一个声明游标的示例: sql DECLAR…

    other 2023年7月28日
    00
  • pycharm 使用anaconda为默认环境的操作

    要使用Anaconda为默认的Python环境,可以按照以下步骤操作: 步骤1:安装Anaconda 首先下载和安装Anaconda,可以从官网(https://www.anaconda.com/)下载安装包。 安装过程中需要勾选“Add Anaconda to my PATH environment variable”选项,这样Anaconda的路径就会被…

    other 2023年6月26日
    00
  • Win11连接wifi频繁掉线怎么办 Win11网络不稳定的解决办法

    针对 Win11 连接 WIFI 频繁掉线和网络不稳定的问题,以下是详细攻略: 1. 关闭电脑和路由器的防火墙 有时,电脑和路由器的防火墙可能会阻止连接,导致 WIFI 频繁掉线。因此,我们可以尝试暂时关闭它们。 首先,我们需要关闭电脑的防火墙:在 Windows 系统中,打开“控制面板”>“系统和安全”>“Windows Defender 防火…

    other 2023年6月27日
    00
  • JavaScript必知必会(五) eval 的使用

    JavaScript必知必会(五) eval 的使用攻略 什么是eval函数? eval()是JavaScript中的一个内置函数,它可以将字符串作为代码来执行。它接受一个字符串参数,并将其解析为JavaScript代码并执行。eval()函数可以用于动态地执行代码,这意味着可以在运行时生成和执行代码。 eval的基本语法 eval(codeString);…

    other 2023年7月29日
    00
  • Android进度条控件progressbar使用方法详解

    Android进度条控件progressbar使用方法详解 Android进度条控件(ProgressBar)是一种常用的UI组件,用于显示任务的进度。本攻略将详细介绍如何使用Android进度条控件,并提供两个示例说明。 1. 添加进度条控件到布局文件 首先,在XML布局文件中添加进度条控件。以下是一个示例: <ProgressBar android…

    other 2023年8月25日
    00
  • tomcat 启动时卡住问题排查及解决方法

    当使用Tomcat启动Web应用程序时,有可能会遇到启动过程中卡住的情况。这篇攻略将带您分步骤排查及解决tomcat启动时卡住问题。 问题排查 1. 检查Tomcat日志 Tomcat启动时通常会向控制台输出一些信息和日志,因此可以打开控制台,查看Tomcat的启动日志信息。如果Tomcat由于某些原因被卡住了,日志中可能会提示错误信息。 2. 检查操作系统…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部