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日

相关文章

  • 剑指Offer之Java算法习题精讲二叉树专题篇上

    剑指Offer之Java算法习题精讲二叉树专题篇上 一、前言 二叉树是算法中非常重要的数据结构,也是面试时常被考察的知识点。在这篇文章中,我们会详细讲解剑指Offer中关于二叉树的Java算法习题精讲,帮助读者更好地掌握二叉树的相关知识。 二、题目汇总 下面是本篇文章中涉及的二叉树习题题目汇总: 题目编号 题目名称 题目描述 4 重构二叉树 输入前序遍历和中…

    other 2023年6月27日
    00
  • Android中banner的使用步骤

    当在Android应用中使用横幅(banner)时,可以按照以下步骤进行设置: 添加依赖库:在项目的build.gradle文件中,添加以下依赖库: implementation ‘com.google.android.gms:play-services-ads:20.2.0’ 在布局文件中添加横幅视图:在需要显示横幅的布局文件中,添加以下代码: <c…

    other 2023年8月20日
    00
  • 安卓 获取手机IP地址的实现代码

    获取安卓手机的IP地址可以通过以下步骤实现: 添加网络权限:在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" /> <uses-permission androi…

    other 2023年7月31日
    00
  • 简单了解spring bean作用域属性singleton和prototype的区别

    简单了解Spring Bean作用域属性singleton和prototype的区别 在Spring框架中,Bean的作用域属性定义了Bean实例的生命周期和可见性。Spring提供了多种作用域属性,其中最常用的是singleton和prototype。下面将详细讲解这两种作用域属性的区别,并提供两个示例说明。 Singleton作用域 Singleton作…

    other 2023年8月19日
    00
  • 写给初学者的linuxerrno错误码机制

    写给初学者的Linux errno错误码机制 作为Linux系统开发或运维工作中不可或缺的一部分,errno错误码机制是初学者难以回避的知识点。本文将从errno概念和常见的错误码、errno与系统调用、errno如何获取和处理以及相关的系统工具和资源等几个方面详细介绍Linux errno错误码机制,希望能为初学者提供参考和帮助。 errno概念和常见错误…

    其他 2023年3月28日
    00
  • 解读Python编程中的命名空间与作用域

    解读Python编程中的命名空间与作用域攻略 1. 什么是命名空间和作用域? 在Python编程中,命名空间(Namespace)是一个用于存储变量和函数名称的容器,以便在程序中进行访问和使用。每个命名空间都有一个唯一的名称,并且可以包含其他命名空间。命名空间的主要目的是避免命名冲突,使得不同的变量和函数可以具有相同的名称,但在不同的命名空间中仍然是唯一的。…

    other 2023年8月15日
    00
  • jenkins运行python脚本

    Jenkins运行Python脚本 Jenkins是一款流行的持续集成和持续部署工具,可以自动构建、测试和部署你的应用程序。它支持多种编程语言和技术,并且扩展性非常强,可以通过插件来适应不同的场景和需求。在本文中,我们将介绍如何使用Jenkins来运行Python脚本。 准备工作 在开始之前,需要准备以下工具和环境: 安装Jenkins服务器; 安装Pyth…

    其他 2023年3月28日
    00
  • 网页加载进度条详解(推荐)

    网页加载进度条详解(推荐) 1. 什么是网页加载进度条? 网页加载进度条是指当用户打开网页时,浏览器会加载网页的各种资源,比如 HTML、CSS、JavaScript、图片等,通过加载进度条可以让用户了解网页的加载进度,增强用户体验。 2. 实现网页加载进度条的常用方式 实现网页加载进度条的常用方式有以下两种: 2.1 CSS3 实现方式 CSS3 有一个线…

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