详解js中的原型,原型对象,原型链

yizhihongxing

我来为你详细讲解“详解js中的原型,原型对象,原型链”的完整攻略。

1. 原型

在 Javascript 中,每个对象都有一个原型对象(prototype)。原型是一个简单的对象,它是由对象创建函数(Object、Array、Function 等)创建的。

我们来看一个简单的示例:

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

const person = new Person('Jack', 20);
console.log(person);

输出结果:

Person { name: 'Jack', age: 20 }

在这个示例中,我们创建了一个构造函数 Person,并通过 new 关键字创建了一个实例对象 person。实例对象 person 通过该构造函数 Person 的原型进行了继承。在 JavaScript 中,每个函数都有一个 prototype 属性,它指向的就是这个实例对象的原型。

console.log(Person.prototype);

输出结果:

Person {}

这里的 Person.prototype 就是 person 对象的原型。可以发现原型是一个普通的空对象。如果要向原型中添加属性或方法,可以直接在 Person.prototype 对象中定义和修改,例如:

Person.prototype.sayName = function() {
  console.log(this.name);
};
person.sayName(); // 输出 Jack

2. 原型对象

JavaScript 中的函数都是对象,因此它们也有一个原型对象。例如,通过函数对象 Function.prototype 对象添加的方法和属性,可以在所有函数中调用。

在前面的示例中,我们已经使用过构造函数的原型对象 Person.prototype,在这里再来加深一下印象。比如我们现在想添加一个 greet 方法,可以这样写:

Person.prototype.greet = function() {
  console.log('Hello, ' + this.name);
};

3. 原型链

所有的对象都有原型,通过原型链,可以访问到每一个对象的最终原型。原型链的核心就是每个对象都保持着一个内部链接到它自己的原型对象,这个链接成为 [[Prototype]]属性。

在前面的示例中,我们使用了 Person 构造函数创建的实例对象 person 通过原型链接到 Person.prototype 原型对象。Person.prototype 又连接到一个更基本的对象 Object.prototype

console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype); // true

通过原型链,person 实例对象继承了 Person 构造函数的原型对象 Person.prototype 中的属性和方法,同时也继承了 Person.prototype[[Prototype]] 属性,这个属性指向 Object.prototype。因此,实例对象 person 可以调用 Object.prototype 中定义的方法。

比如:

console.log(person.hasOwnProperty('name')); // true
console.log(person.hasOwnProperty('toString')); // false
console.log(Object.prototype.hasOwnProperty('toString')); // true

在这里,我们分别使用 hasOwnProperty 方法来判断 person 实例对象是否包含 name 属性,和 toString 方法,同时也调用了 Object.prototype 中定义的 hasOwnProperty 方法去确认这些属性和方法的继承关系。

综上所述,原型、原型对象和原型链是 JavaScript 中很重要的概念,了解它们的关系可以大大提高代码的可维护性和可读性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解js中的原型,原型对象,原型链 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器

    Easy.Ajax 是一款基于 jQuery 库的 Ajax 库,用于简化 Ajax 的操作流程。其中,Easy.Ajax 部分源代码支持文件上传功能,同时兼容各大主流浏览器。下面将详细讲解该功能的使用方法。 首先,需要在页面中引入必要的文件及库: <!– 引入 jQuery 库 –> <script src="https:/…

    JavaScript 2023年6月11日
    00
  • 深入理解vue的使用

    深入理解Vue的使用 Vue是一款轻量级、易上手的JavaScript框架,它具有数据双向绑定、组件化、虚拟DOM等功能,被广泛应用于前端开发中。本攻略旨在深入理解Vue的使用,包含以下几个方面的内容: Vue实例的创建与生命周期 数据双向绑定与计算属性 组件化与动态组件 父子组件通信 插槽的使用 vue-router的使用 Vue实例的创建与生命周期 Vu…

    JavaScript 2023年6月11日
    00
  • jQuery通过写入cookie实现更换网页背景的方法

    jQuery 通过写入 cookie 实现更换网页背景的方法,实际上就是利用 cookie 存储用户选择的网页背景样式及其对应的 CSS 样式类名,在页面加载时根据 cookie 中存储的样式类名来设置页面背景样式。 具体实现步骤如下: 1. HTML 结构 在 HTML 文档的 head 标签中引入 jQuery 库和自定义 js 文件。 <!DOC…

    JavaScript 2023年6月11日
    00
  • 详解js正则表达式语法介绍

    详解js正则表达式语法介绍 什么是正则表达式 正则表达式是一种强大的文本匹配工具,它可以根据特定的符号和语法定义来描述和匹配文本中某个部分的规律。 在js中,我们可以通过RegExp对象来创建正则表达式,或者直接使用正则表达式字面量(使用斜杠包围)。 正则表达式语法介绍 基本语法 正则表达式由两部分组成:模式和标志。模式是我们想要匹配的文本规律,标志则是对模…

    JavaScript 2023年6月10日
    00
  • JavaScript中Number.NEGATIVE_INFINITY值的使用详解

    JavaScript中Number.NEGATIVE_INFINITY值的使用详解 概述 Number.NEGATIVE_INFINITY是JavaScript中一个特殊的数值类型,表示负无穷大。当进行一些数学计算时,如果结果超出JavaScript所能表示的数值范围,该结果将被自动转换为Number.NEGATIVE_INFINITY。 使用场景 Numb…

    JavaScript 2023年5月28日
    00
  • JQuery 在表单提交之前修改 提交的值 原创

    下面是一份完整的 JQuery 在表单提交之前修改提交值的攻略: 1. 准备工作 首先,在使用 JQuery 改变表单提交值之前,我们需要引入 JQuery 库文件。在 HTML 文件中加入下面的代码: <head> <script src="https://code.jquery.com/jquery-3.5.1.min.js&…

    JavaScript 2023年6月10日
    00
  • javascript Ajax获取远程url的返回判断

    Javascript Ajax获取远程Url的返回判断通常包括以下几个步骤: 1. 创建XMLHttpRequest对象 var request; if (window.XMLHttpRequest) { // 非IE浏览器 request = new XMLHttpRequest(); } else if (window.ActiveXObject) { …

    JavaScript 2023年6月11日
    00
  • 判断js数据类型的函数实例详解

    判断js数据类型的函数实例详解 背景 在JavaScript中,数据类型多种多样,包括了数字、字符串、布尔值、数组、对象、函数等。而有些时候,需要用JavaScript代码来对不同的数据类型做不同的操作。因此,了解如何判断这些数据类型就显得非常重要了。本文将详细讲解如何通过函数来判断JavaScript中不同数据类型。 判断数据类型的函数 typeof函数 …

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部