js 原型对象和原型链理解

JS 原型对象和原型链理解

在 JavaScript 中,每个对象都有一个内部属性 [[Prototype]],也可以叫做原型,它指向另一个对象,而后者则有自己的原型,这样就形成了一个链接的原型链。最终的原型指向 null

原型对象

原型对象是函数对象的一个属性 prototype,它是一个对象,包含了一些属性和方法,这些属性和方法会被实例对象所继承。每当定义一个新函数时,都会自动生成一个包含 constructor 属性和其他默认属性的对象,这个对象就是函数的原型。

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

Person.prototype.sayName = function() {
  console.log(this.name);
};

let person = new Person('Tom', 18);
console.log(person.__proto__ === Person.prototype);  // true
console.log(person.constructor === Person);  // true

在上面的例子中,Person.prototype 对象上定义了一个 sayName 方法,这个方法会被 person 对象所继承。

原型链

每个对象都有一个内部属性 [[Prototype]],它指向另一个对象,另一个对象也有它自己的 [[Prototype]],这样就形成了一个链接的原型链。当我们访问一个对象的某个属性或方法时,首先会在自身属性和方法中查找,如果没有找到,就会沿着原型链一级一级向上查找,直到找到为止,如果一直到最顶层都没有找到,就会返回 undefined

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

Person.prototype.sayName = function() {
  console.log(this.name);
};

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

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

let student = new Student('Tom', 18, '三年级');
console.log(student.__proto__ === Student.prototype);  // true
console.log(student.__proto__.__proto__ === Person.prototype);  // true
console.log(student.__proto__.__proto__.__proto__ === Object.prototype);  // true
console.log(student.__proto__.__proto__.__proto__.__proto__);  // null

在上面的例子中,Student.prototype 继承了 Person.prototype,而 Person.prototype 则继承了 Object.prototype,最终的原型链就是 student.__proto__ -> Student.prototype -> Person.prototype -> Object.prototype -> null

总结

JavaScript 通过原型链实现继承,每个对象都有一个 [[Prototype]] 属性,它指向另一个对象,这样就形成了一个链接的原型链。原型链上的属性和方法会被对象继承,当我们访问一个对象的某个属性或方法时,会沿着原型链一级一级向上查找。

需要注意的是,虽然我们可以通过直接修改 __proto__ 属性或 Object.setPrototypeOf() 方法来修改对象的原型,但是这种行为并不推荐,它会导致 JavaScript 引擎进行一些非常耗费性能的优化和检查工作。建议我们使用 Object.create() 方法和构造函数来进行继承和原型对象的维护,以保证代码的可读性和可维护性。

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

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

相关文章

  • JS Object构造函数之Object.freeze

    Object.freeze()是JavaScript中的一个内置方法,它会冻结一个对象,使对象成为不可修改的。一旦一个对象被冻结,任何的属性、值、方法等都将不能被修改、添加、删除或重新赋值。 使用Object.freeze()方法能有效地保护Javascript对象的数据,避免意外修改,从而提高代码的可维护性和安全性。 Object.freeze()方法的用…

    JavaScript 2023年5月28日
    00
  • Web js实现复制文本到粘贴板

    要在Web页面中使用JavaScript实现将文本复制到剪贴板,需要使用Clipboard API。以下是实现此功能的完整攻略: 步骤一:检查浏览器兼容性 检查浏览器是否支持 Clipboard API: if (!navigator.clipboard) { console.log(‘浏览器不支持 Clipboard API.’); } 步骤二:编写复制到…

    JavaScript 2023年6月10日
    00
  • threejs后期处理的基本使用方法之加特效

    Threejs后期处理的基本使用方法之加特效 前言 在Three.js中,后期处理是在渲染器执行完菜单渲染中的所有对象之后对渲染结果进行筛选和修改的一种技术。Three.js提供了多种后期处理方法,如全屏像素化、阴影、镜面反射等等。本攻略将介绍Three.js中加特效的基本使用方法,希望可以帮到你。 加特效 加特效(GlitchPass)是Three.js中…

    JavaScript 2023年6月11日
    00
  • JS简单实现动态添加HTML标记的方法示例

    下面是JS简单实现动态添加HTML标记的方法示例的完整攻略: 什么是动态添加HTML标记 动态添加HTML标记是通过JavaScript代码在页面加载或者页面交互过程中,用代码的方式添加或删除HTML标记元素的过程。该过程可以实现动态更新页面内容,增强用户交互体验,丰富页面功能等目的,是Web开发中非常重要的一环。 如何动态添加HTML标记 示例1:使用in…

    JavaScript 2023年6月10日
    00
  • JavaScript基础之静态方法和实例方法分析

    JavaScript基础之静态方法和实例方法分析 什么是静态方法与实例方法? 在 JavaScript 中,我们常常需要使用到一些函数或方法来将数据进行处理或者实现某些功能。那么,这些函数或方法又可以分为两种不同类型:静态方法和实例方法。 静态方法:静态方法是指在类名上被调用,而无需实例化对象的方法。它们通常用于创建和管理类本身和类内部属性,如Math.ab…

    JavaScript 2023年5月28日
    00
  • js实现简单的购物车有图有代码

    让我来为大家详细讲解一下如何用js实现简单的购物车吧。 1. 确定数据结构 在开始实现购物车之前,我们需要先确定其数据结构。在此,我们可以采用一个数组来储存购物车中的商品信息,其中每个元素都是一个对象,包含商品的相关信息:名称、价格、数量等,示例代码如下: let cart = [ { name: "商品1", price: 10, qu…

    JavaScript 2023年6月11日
    00
  • Ajax实现简单下拉选项效果【推荐】

    下面就来讲解一下“Ajax实现简单下拉选项效果【推荐】”的实现过程。 标题 首先,我们需要确定这篇攻略的标题。可以考虑使用以下标题: Ajax实现简单下拉选项效果 确定需求 接下来,我们需要确定这篇攻略的具体需求。根据标题,我们需要实现一个下拉选项效果,包含以下需求: 网页打开时,异步请求获取下拉选项的内容并展示。 当用户选择某个选项时,通过Ajax异步请求…

    JavaScript 2023年6月11日
    00
  • js中对象与对象创建方法的各种方法

    下面是关于JavaScript中对象以及创建对象的方法的详细攻略。 一、对象的定义 在JavaScript中,对象是一组属性和方法的集合。对象可以像字典一样,用键值对来存储和调用属性和方法。 对象定义的方式有两种: 1. 直接量方式 直接量方式就是在大括号内写对象的属性和方法: let person = { name: ‘张三’, age: 18, sayH…

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