Javascript中prototype与__proto__的关系详解

yizhihongxing

下面我来为大家讲解“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日

相关文章

  • 新款TP-Link TL-WR886N无线路由器重启方法介绍

    新款TP-Link TL-WR886N无线路由器重启方法介绍 一、重启方法 要重启你的TP-Link TL-WR886N无线路由器,你可以通过以下步骤实现: 找到路由器的电源插头,将其拔出。 等待30秒钟。 将电源插头重新插入路由器,等待路由器重新启动。 二、重启原因 有很多原因可能需要重启TP-Link TL-WR886N无线路由器,例如: 路由器出现无法…

    other 2023年6月27日
    00
  • 如何最大限度减少线缆设计中的串扰的解决方案

    为了最大限度减少线缆设计中的串扰,我们可以采取以下解决方案: 1. 优化线缆排列和隔离 线缆的排列和隔离是减少串扰的关键。建议尽可能将同类信号的线缆分开,降低它们之间的交叉程度。例如,在一个机房内,可以将电缆、网络线、电话线等分别排列,然后使用屏蔽材料将它们隔开。这样可以有效减少信号之间的交叉干扰,提高整个系统的抗干扰能力。 示例说明: 假如一个机房内需要布…

    other 2023年6月26日
    00
  • 关于MVC EF架构及Repository模式的一点心得

    关于MVC EF架构及Repository模式的一点心得 在现代web应用程序设计中,MVC EF架构已经成为开发人员最常用的架构之一,这种架构利用MVC的分层特性和EF的数据访问能力来实现高效的开发过程和可维护性的代码。同时,为了进一步提高代码的可重用性和测试性,Repository模式被引入到MVC EF架构中。 什么是MVC EF架构 MVC EF架构…

    其他 2023年3月28日
    00
  • android中用studio更改包名

    Android中用Studio更改包名 在Android开发中,我们经常需要更改应用程序的包名(Package Name)。可能是因为需要为同一个项目创建不同的版本,也有可能是在投放市场之前需要更改包名,以防止与现有应用程序冲突。本篇文章将介绍在Android Studio中如何更改应用程序包名。 何时需要更改应用程序包名 在Android中,应用程序包名用…

    其他 2023年3月28日
    00
  • 苹果iOS9.1 Beta4固件下载地址汇总 百度网盘更新中

    苹果iOS9.1 Beta4固件下载地址汇总 百度网盘更新中攻略 简介 本攻略将详细介绍如何获取苹果iOS9.1 Beta4固件的下载地址,并说明如何使用百度网盘进行下载。请按照以下步骤进行操作。 步骤 步骤一:访问固件下载地址汇总网页 首先,打开你的浏览器,访问固件下载地址汇总网页。你可以在搜索引擎中搜索“苹果iOS9.1 Beta4固件下载地址汇总”,找…

    other 2023年8月4日
    00
  • CentOS中网络配置相关文件配置选项说明

    下面是”CentOS中网络配置相关文件配置选项说明”的完整攻略。 网络配置相关文件 在 CentOS 中,和网络相关的配置文件主要有以下几个: /etc/sysconfig/network-scripts/ifcfg-<网卡名称>:每个网卡对应一个配置文件。 /etc/sysconfig/network:配置主机名及网关等全局网络参数。 /etc…

    other 2023年6月25日
    00
  • 微信开发者工具怎么修改内存限制?微信开发者工具修改内存限制教程

    微信开发者工具怎么修改内存限制 微信开发者工具默认内存限制是500MB,对于部分复杂应用或者大型项目可能会出现内存不足的情况,需要修改内存限制来提高开发效率。 修改内存限制步骤 打开微信开发者工具,选择菜单栏的“设置”。 在设置页面中,找到“关于”选项卡。 在“关于”选项卡中找到“其他设置”中的“启动参数”。 在启动参数中添加–max-old-space-…

    other 2023年6月26日
    00
  • Newifi mini怎么分配静态IP地址?Newifi mini的静态IP地址分配方法详解

    Newifi mini怎么分配静态IP地址? 如果你想为Newifi mini路由器分配静态IP地址,可以按照以下步骤进行操作: 首先,确保你已经连接到Newifi mini的管理界面。你可以在浏览器中输入路由器的默认IP地址(通常是192.168.1.1)来访问管理界面。 在管理界面中,输入你的用户名和密码登录。如果你是第一次登录,可以使用默认的用户名和密…

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