全面解析js中的原型,原型对象,原型链

全面解析JS中的原型、原型对象、原型链

1. 原型

在Javascript中,每个函数都有一个内部属性 prototype,可以被称为原型。我们可以通过构造函数的 prototype 属性来为所有实例共享方法和属性。

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}

const person1 = new Person('Tom', 18);
const person2 = new Person('Jerry', 20);

person1.sayHello(); // 输出:Hello, my name is Tom and I'm 18 years old.
person2.sayHello(); // 输出:Hello, my name is Jerry and I'm 20 years old.

2. 原型对象

在JavaScript中,所有的对象都有一个特殊的属性 __proto__,它指向了对象的原型。我们可以通过对象的 __proto__ 属性来访问原型对象。每个构造函数的 prototype 都是一个对象,它作为 Constructor 构造函数的原型对象。

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

const person1 = new Person('Tom', 18);

// 访问原型对象
console.log(Person.prototype); // 输出:{sayHello: ƒ, constructor: ƒ}
console.log(person1.__proto__); // 输出:{sayHello: ƒ, constructor: ƒ}

// 验证原型对象
console.log(Person.prototype === person1.__proto__); // 输出:true

3. 原型链

当我们访问一个对象的属性时,如果对象本身没有该属性,javascript会沿着对象的 __proto__ 属性向上查找,一直到 __proto__ 为 null,该属性不存在。这个查找的过程就是原型链。

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}

const person1 = new Person('Tom', 18);

person1.sayHello(); // 输出:Hello, my name is Tom and I'm 18 years old.
console.log(person1.toString()); // 输出:[object Object]

在上面的代码中,当我们调用 person1.sayHello() 的时候,由于 person1 没有 sayHello 方法,javascript会在 person1.__proto__ 中查找,找到了 Person.prototype 中的 sayHello 方法并执行了;而当我们调用 person1.toString() 方法的时候,javascript会一直往上查找,最后找到了 Object.prototype 中的 toString 方法并执行了。

示例1

function Animal(name) {
  this.name = name;
}

Animal.prototype.hello = function() {
  console.log(`I'm ${this.name}.`);
}

function Dog(name, color) {
  this.color = color;
  Animal.call(this, name); // 调用父类构造函数,通过call或apply方法改变this的指向
}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
  console.log(`I'm a ${this.color} dog.`);
}

const dog1 = new Dog('Toby', 'brown');
dog1.hello(); // 输出:I'm Toby.
dog1.bark(); // 输出:I'm a brown dog.

在上面的代码中,我们定义了一个 Animal 构造函数用于创建动物,并给所有动物都添加了一个 hello 方法。接着我们定义了一个 Dog 构造函数用于创建狗,继承了 Animal 构造函数,并给狗添加了一个 bark 方法。最后我们创建了一个 dog1 对象,并调用了 hellobark 方法,通过原型链的查找,我们成功访问到了继承的方法。

示例2

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

const person1 = new Person('Tom');

console.log(person1.constructor); // 输出:[Function: Person]
console.log(person1.__proto__.constructor); // 输出:[Function: Person]
console.log(Person.prototype.constructor); // 输出:[Function: Person]

在上面的代码中,我们定义了一个 Person 构造函数用于创建人,并创建了一个 person1 对象。接着我们访问了三个 constructor 属性,并打印了它们的值。由于 constructor 属性会随着 prototype 属性共享,在原型链的查找中被访问到,因此它们三个的值是相等的。

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

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

相关文章

  • JavaScript原始值与包装对象的详细介绍

    我来为你详细讲解“JavaScript原始值与包装对象的详细介绍”这个话题。 JavaScript原始值和包装对象介绍 在JavaScript中,原始值指的是不可变的基本类型数据,例如字符串、数字、布尔值等,而非原始值则是JavaScript提供的对象类型。在操作原始值时,JavaScript会自动创建一个临时的包装对象(Wrapper Object),在操…

    JavaScript 2023年6月11日
    00
  • JS实现多物体运动的方法详解

    JS实现多物体运动的方法详解 在Web开发中,常常需要实现多个物体同时进行运动的效果,这时我们可以使用JavaScript来控制多个DOM元素的运动。本文将详细讲解JS实现多物体运动的方法。 步骤一:获取多个DOM元素的初始状态 在程序开始运行之前,我们需要获取多个DOM元素的初始状态,这些状态包括元素的初始位置、大小、颜色等信息。在JavaScript中可…

    JavaScript 2023年6月11日
    00
  • ES6基础之字符串和函数的拓展详解

    很高兴为您介绍“ES6基础之字符串和函数的拓展详解”的完整攻略。 第一部分:字符串的拓展 模板字符串 ES6添加了模板字符串的语法,它使用反引号(`)来定义字符串,并且可以内嵌变量: let name = ‘Lucy’; let age = 18; console.log(`My name is ${name}, and I am ${age} years …

    JavaScript 2023年5月28日
    00
  • javascript学习笔记(十二) RegExp类型介绍

    下面是关于“javascript学习笔记(十二) RegExp类型介绍”的完整攻略。 RegExp类型介绍 RegExp类型是JS语言中表示正则表达式的类型。正则表达式是一种用于模式匹配的工具,可以用来匹配字符串中的文本模式,在字符串的搜索、替换、切割等操作中特别方便。 创建RegExp实例 创建RegExp实例的两种方式: 字面量方式 javascript…

    JavaScript 2023年6月10日
    00
  • js简单判断移动端系统的方法

    判断移动端系统是JS中非常常见的一个需求,下面给出几种判断方式: 方法一:根据navigator.userAgent字符串进行判断 移动端设备的 UA(UserAgent)字符串中,都会包含操作系统的信息,因此我们可以通过解析 UA 字符串来判断设备使用的操作系统。其中一些常见的 UA(UserAgent)字符串包括: Android:/Android/i …

    JavaScript 2023年6月10日
    00
  • JS保存和删除cookie操作 判断cookie是否存在

    下面是JS保存和删除cookie操作以及判断cookie是否存在的完整攻略。 保存cookie 在JS中,保存cookie需要使用document.cookie属性,并将需要保存的键值对以字符串的形式传递给该属性。具体操作步骤如下: 根据需要创建需要保存的键值对。 将键值对以字符串的形式传递给document.cookie属性。 示例如下: // 创建需要保…

    JavaScript 2023年6月11日
    00
  • 关于JavaScript的gzip静态压缩方法

    关于JavaScript的gzip静态压缩方法,下面是详细攻略: 1. 什么是gzip压缩 gzip是一种流行的数据压缩算法,用于减少网络流量并加快Web页面的加载速度。在JavaScript中,gzip可以压缩脚本文件,减少文件大小,加速页面加载。 2. 如何进行gzip压缩 2.1 node.js的gzip压缩方法 Node.js是一个流行的JavaSc…

    JavaScript 2023年5月27日
    00
  • Nuxt项目支持eslint+pritter+typescript的实现

    首先,需要明确一下Nuxt.js是一个基于Vue.js的框架,它提供了一些有用的工具和约定,使得我们可以快速地进行服务端渲染的开发,因此Nuxt.js的项目开发需要支持ESLint+Prettier+TypeScript的实现。下面给出如何在Nuxt项目中实现支持这三个工具的流程: 第一步:初始化Nuxt项目 npx create-nuxt-app my-p…

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