JavaScript进阶(四)原型与原型链用法实例分析

yizhihongxing

关于“JavaScript进阶(四)原型与原型链用法实例分析”的完整攻略,以下是详细讲解:

什么是原型

JavaScript 中的每个对象都有一个指向它的原型。原型是一个包含属性和方法的对象,它可以被用来共享那些在多个实例之间共享内容的属性和方法。当我们在一个实例中访问一个属性或者一个方法时,它会先在实例本身中查找该属性或方法,如果没有找到,就会去实例的原型中查找。

在 JavaScript 中,一个对象的原型可以通过 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('Alice', 25);
person1.sayHello(); // Hello, my name is Alice, and I'm 25 years old.

在上面的代码中,我们给 Person 函数添加了一个 protoype 属性,这个属性是一个包含一个 sayHello 方法的对象。当我们使用 new 操作符创建一个 Person 实例后,该实例就会从原型中继承到 sayHello 方法。

什么是原型链

JavaScript 中的每个对象都能通过一个内部属性 [[Prototype]] 来访问它的原型。这个内部属性不能被直接访问,但我们可以通过 __proto__ 属性来访问它。当我们访问一个对象的属性时,如果该属性不存在于对象本身,那么 JavaScript 引擎会去对象的 [[Prototype]] 所指向的对象(也就是原型)中查找该属性。如果该属性还不存在于原型对象中,那么引擎会继续沿着原型链向上查找,直到找到该属性或查找到原型链的顶端 Object.prototype 为止。

下面的示例中,我们列出了一个样例对象的原型链结构:

const obj = {
  foo: 'bar'
};

console.log(obj.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true

在上面的代码中,我们创建了一个包含 foo 属性的对象,该对象的原型就是 Object.prototypeObject.prototype 的原型是 null,也就是原型链的顶端。

创建对象的几种方式

在 JavaScript 中,创建对象有几种方式。下面是几种常见的方式:

1. 对象字面量

对象字面量是最简单的创建对象的方式。这种方式非常灵活,可以方便地创建出我们想要的任何对象。例如:

const person = {
  name: 'Alice',
  age: 25,
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}, and I'm ${this.age} years old.`);
  }
};

person.sayHello(); // Hello, my name is Alice, and I'm 25 years old.

在上面的代码中,我们使用对象字面量创建了一个 person 对象,它有一个 name 属性、一个 age 属性和一个 sayHello 方法。

2. 工厂函数

工厂函数是一种比对象字面量更灵活的创建对象的方式。这种方式可以让我们更方便地复用代码和创建多个相似的对象。例如:

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

const person1 = createPerson('Alice', 25);
person1.sayHello(); // Hello, my name is Alice, and I'm 25 years old.

const person2 = createPerson('Bob', 30);
person2.sayHello(); // Hello, my name is Bob, and I'm 30 years old.

在上面的代码中,我们创建了一个 createPerson 工厂函数,它接受 nameage 作为参数,然后返回一个包含这两个属性和一个 sayHello 方法的对象。我们可以使用这个函数来创建多个相似的对象。

3. 构造函数

构造函数是一种创建对象的方式,它可以让我们更方便地创建多个相似的对象,并且可以使用 new 操作符来创建对象。例如:

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

const person1 = new Person('Alice', 25);
person1.sayHello(); // Hello, my name is Alice, and I'm 25 years old.

const person2 = new Person('Bob', 30);
person2.sayHello(); // Hello, my name is Bob, and I'm 30 years old.

在上面的代码中,我们创建了一个 Person 构造函数,它接受 nameage 作为参数。然后,我们使用 new 操作符来创建两个实例,分别是 person1person2

原型继承

在 JavaScript 中,原型可以被用来实现继承。子类可以继承父类的属性和方法,从而让子类获得父类的特性。下面是一个原型继承的示例:

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

Animal.prototype.sayName = function() {
  console.log(`My name is ${this.name}.`);
};

function Dog(name) {
  Animal.call(this, name);
}

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

Dog.prototype.bark = function() {
  console.log('Woof!');
};

const dog = new Dog('Bailey');
dog.sayName(); // My name is Bailey.
dog.bark(); // Woof!

在上面的代码中,我们定义了一个 Animal 父类和一个 Dog 子类。在 Dog 的构造函数中,我们调用了 Animal 的构造函数,并传入了名字。接着,我们使用 Object.create 方法来创建 Dog 的原型,使它继承自 Animal 的原型。最后,我们给 Dog 的原型添加一个 bark 方法。

改变原型

在 JavaScript 中,我们可以通过改变原型来为已存在的对象添加新的属性和方法。下面是一个改变原型的示例:

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}.`);
};

const person = new Person('Alice');
person.sayHello(); // Hello, my name is Alice.

Person.prototype.sayGoodbye = function() {
  console.log(`Goodbye, my name is ${this.name}.`);
};

person.sayGoodbye(); // Goodbye, my name is Alice.

在上面的代码中,我们首先给 Person 的原型添加了一个 sayHello 方法,然后创建了一个 person 实例并调用了它的 sayHello 方法。接着,我们又给 Person 的原型添加了一个 sayGoodbye 方法,然后又通过 person 实例调用了它的 sayGoodbye 方法。从输出结果可以看出,我们成功地给已存在的对象 person 添加了新的方法。

总之,原型和原型链是 JavaScript 中比较重要的概念。它们可以被用来实现很多有用的功能,例如继承、改变已存在的对象等。我们需要深入学习这些概念,并在实际的开发中加以运用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript进阶(四)原型与原型链用法实例分析 - Python技术站

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

相关文章

  • nuxt.js添加环境变量,区分项目打包环境操作

    在Nuxt.js中,可以通过添加环境变量来区分项目的打包环境,以便更好地为不同的环境配置应用程序。下面是Nuxt.js添加环境变量,区分项目打包环境操作的完整攻略。 1. 添加环境变量 在Nuxt.js应用程序中添加环境变量需要使用到一些npm包,我们可以通过以下命令安装它们: npm i dotenv-webpack cross-env -D 然后在Nux…

    Vue 2023年5月28日
    00
  • Vue3 源码导读(推荐)

    下面就详细讲解一下“Vue3 源码导读(推荐)”的完整攻略。 概述 在Vue.js开发过程中,我们都知道Vue.js是一个非常好用的MVVM框架,而Vue.js3的发布也备受关注。Vue.js 3.0采用完全重写的方式,核心代码相比2.x版本变化较大,提高了性能。 导读 为了能够更好地学习Vue.js 3.0,我们需要先了解Vue.js 3.0的源码结构和架…

    Vue 2023年5月27日
    00
  • vue打印插件vue-print-nb的实现代码

    下面详细讲解一下vue打印插件vue-print-nb的实现代码的攻略。 1. 确认安装 首先需要确认已经在vue项目中安装了vue-print-nb插件,确认方法可通过以下命令进行: npm list vue-print-nb 如果已经正确安装,则可查看到vue-print-nb以及其依赖项在项目文件夹中的位置。 2. 使用vue-print-nb插件 接…

    Vue 2023年5月27日
    00
  • vue实现文件上传功能

    下面我将详细介绍如何使用Vue实现文件上传功能,过程中将包含两个示例。 一、准备工作 1. 安装依赖 首先需要安装axios和qs这两个依赖。axios是一个基于promise的HTTP请求库,可以用于浏览器和Node.js,而qs是用于解析和格式化查询字符串的工具。 npm install axios qs 2. 配置请求头 当我们进行文件上传时,需要将请…

    Vue 2023年5月28日
    00
  • vue项目中main.js使用方法详解

    当我们创建一个Vue项目时,main.js是一个非常重要的入口文件,其作用是引入Vue库,创建Vue实例,并将Vue实例挂载到指定的DOM元素上。下面详细讲解main.js使用方法。 1. 引入Vue库和App.vue组件 首先,我们需要在main.js文件中引入所需的依赖:Vue库和App.vue组件。示例代码如下: import Vue from ‘vu…

    Vue 2023年5月27日
    00
  • 详解vue-cli项目中用json-sever搭建mock服务器

    下面是详解“详解vue-cli项目中用json-sever搭建mock服务器”的完整攻略: 一、什么是json-server JSON Server是一个基于Node.js的RESTful API服务器,可以通过在本地运行json文件中的数据创建完整的RESTful API,这在前端开发中用于测试和模拟数据非常有帮助。 二、在Vue-cli项目中安装json…

    Vue 2023年5月28日
    00
  • 使用Mockjs模拟接口实现增删改查、分页及多条件查询

    使用Mockjs模拟接口实现增删改查、分页及多条件查询可以分为以下步骤: 安装Mock.js库 使用npm安装Mock.js库:npm install mockjs –save-dev 创建Mock接口数据 在项目中创建一个mock文件夹,其中的api.js文件用于存放Mock接口数据,具体代码如下: import Mock from ‘mockjs’ c…

    Vue 2023年5月27日
    00
  • 十个有用的自定义Vue钩子函数总结

    下面详细讲解一下”十个有用的自定义Vue钩子函数总结”的攻略: 1. 什么是Vue钩子函数 Vue.js提供了很多生命周期钩子函数,我们可以在不同的阶段对应的函数中执行代码。其实,除了Vue.js官方提供的钩子函数,我们还可以自己定义钩子函数,方便我们在需要的时候进行统一处理。 2. 自定义Vue钩子函数的常用场景 2.1 全局数据加载提示 在请求全局数据时…

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