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日

相关文章

  • 上周方法病毒来源竟然为ad.pchome.net原来被挂马

    背景 近期有关“上周方法病毒来源竟然为ad.pchome.net原来被挂马”的消息引起了广泛关注。该事件中,许多用户访问了ad.pchome.net网站后,他们的电脑就被感染了这个叫做“上周方法”的恶意软件。 方法 如何避免这种恶意软件的感染,以下是一些防范方法供您参考: 1.更新系统和软件 恶意软件通常利用系统或软件的漏洞进行传播。因此,及时更新操作系统和…

    JavaScript 2023年6月11日
    00
  • JavaScript中强大的操作符使用详解

    JavaScript中强大的操作符使用详解 JavaScript中的操作符可用于进行数学或布尔运算。其中一些操作符非常强大且使用频率也很高。在本文中,我将详细介绍这些操作符及其用法。 算术操作符 算术操作符用于数学运算。 加号操作符(+) 加号操作符可用于执行数学加法或字符拼接。对于两个数字相加的情况,其用法如下: let a = 5, b = 6; let…

    JavaScript 2023年5月17日
    00
  • JSONP跨域的原理解析及其实现介绍

    下面我将详细讲解“JSONP跨域的原理解析及其实现介绍”的完整攻略。 什么是JSONP跨域 首先,需要了解JSONP(JSON with Padding)是什么。在网络应用中,由于安全策略的限制,浏览器不能直接跨域获取数据。JSONP利用“script”标签不受跨域限制的特性,通过动态创建“script”标签,并在服务器返回的数据中添加一个回调函数,从而实现…

    JavaScript 2023年5月27日
    00
  • js几个验证函数代码

    请允许我为您提供一份“JS几个验证函数代码”的完整攻略。 1. 概述 在网页开发中,往往需要在表单中添加一些数据验证功能,用于对用户输入的数据进行验证,确保数据的正确性。下面介绍几个常用的JS数据验证函数,分别对应验证电话号码、邮箱地址、以及身份证号码等。 2. 函数 2.1 验证电话号码 通过正则表达式判断输入的字符串是否为合法的电话号码,其中 ^[1][…

    JavaScript 2023年6月10日
    00
  • Javascript aop(面向切面编程)之around(环绕)分析

    JavaScript AOP(面向切面编程)是一种可以帮助我们在不改变原有代码的前提下,在代码执行前、中、后插入新的逻辑的编程技术。其中,Around(环绕)是AOP的一种实现方式,它可以在目标方法被调用之前和之后执行自定义的方法。 下面是使用JavaScript实现Around AOP的完整攻略。 1. 定义目标方法 首先,我们需要定义一个目标方法,也就是…

    JavaScript 2023年5月27日
    00
  • Javascript RegExp global 属性

    JavaScript RegExp的global属性 JavaScript的RegExp对象中的global属性是一个布尔值,表示正则表达式是否具有全局标志g。当global属性为true时,正则表达式将匹配字符串中的所有匹配项而不仅仅是第一个匹配项。 语法 global属性的语法如下: RegExp.global 示例1:使用global属性匹配字符串中的…

    JavaScript 2023年5月11日
    00
  • JavaScript原生节点操作小结

    下面是“JavaScript原生节点操作小结”的详细攻略。 1. 节点操作的概述 可以通过JavaScript创建节点、添加节点、删除节点、替换节点、修改节点等操作,从而动态地改变HTML页面的内容。 节点操作是Web开发中非常常见的技术,掌握该技术可以让你更好地操作网页,实现更加丰富、复杂的页面效果。 2. 使用原生JavaScript操作节点 在Java…

    JavaScript 2023年6月10日
    00
  • js实现的格式化数字和金额功能简单示例

    想要实现”js实现的格式化数字和金额功能”,我们需要掌握以下知识点: 如何为数字添加千分位分隔符 如何为金额数字统一格式化成xxx,xxx.xx样式 下面是具体的实现步骤和示例说明: 一、为数字添加千分位分隔符 1.1 千分位分隔符的基本原理 千分位分隔符指的是将数字的每三位从右往左依次插入一个逗号(,),比如将1000000格式化为1,000,000。 可…

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