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

关于“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日

相关文章

  • vue给对象添加属性没有响应式的问题及解决

    针对“vue给对象添加属性没有响应式的问题及解决”的问题,我们需要了解Vue的响应式系统以及如何正确地添加响应式属性。 Vue的响应式系统 首先,我们需要了解Vue的响应式系统是基于ES5的Object.defineProperty实现的,它会在监听的属性被修改时触发更新。当我们通过Vue.$set或者直接使用赋值的方式改变组件的data中对象的属性时,我们…

    Vue 2023年5月28日
    00
  • 浅谈VUE防抖与节流的最佳解决方案(函数式组件)

    浅谈VUE防抖与节流的最佳解决方案 什么是防抖和节流 防抖和节流是前端开发中常用的性能优化技巧,其中防抖是指防止在短时间内重复触发同一事件,而节流是指在一段时间内最多只能触发一次事件。这两种技术的应用场景主要是为了避免频繁操作引起的性能问题,比如浏览器滚动、输入框输入等。 什么是函数式组件 在Vue中,有两种组件,一种是常规的组件,另一种则是函数式组件。函数…

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

    下面我将为您详细讲解“node+vue实现文件上传功能”的完整攻略。 技术实现方案 实现文件上传功能需要前后端协同完成,一般采用以下技术方案: 前端:Vue + element-ui 后端:Node.js + Express 存储:阿里云 OSS 或者本地文件系统 前端实现 准备工作 1.在项目中引入 element-ui 和 axios npm insta…

    Vue 2023年5月28日
    00
  • Python3.10接入ChatGPT实现逐句回答流式返回

    下面是详细的攻略: 1. 概述 ChatGPT是一个基于深度学习技术的自然语言处理工具,可以进行对话生成、文本摘要等任务。而Python 3.10是Python编程语言的最新版本,有很多新增功能和改进。本教程将介绍如何使用Python 3.10接入ChatGPT,实现逐句回答并流式返回。 2. 准备工作 在开始之前,需要进行以下准备工作: 2.1 安装Pyt…

    Vue 2023年5月28日
    00
  • vue3的watch和watchEffect你了解吗

    当我们在使用Vue.js开发应用时,经常需要监听数据的变化并做出相应的响应,在Vue.js中,我们可以使用watch和watchEffect这两个响应式API来实现数据的监听。 watch watch是Vue.js中的一个响应式API,用于监听指定数据的变化并做出相应的响应。在Vue3中,我们可以通过watch函数来创建一个监听器。 watch的基本用法 以…

    Vue 2023年5月27日
    00
  • vue3中组件传值的多种方法总结

    下面是详细讲解“vue3中组件传值的多种方法总结”的完整攻略。 1. 组件传值概述 在vue3中,组件传值是非常常见的场景,通常包括父组件向子组件传值和子组件向父组件传值两种类型。 在vue3中,组件传值的方式主要包括如下几种: 父组件向子组件传值(prop) 子组件向父组件传值($emit) 祖先组件向后代组件传值(provide/inject) 跨级组件…

    Vue 2023年5月29日
    00
  • node前端模板引擎Jade之标签的基本写法

    Jade是一种node.js前端模板引擎,其核心特点是通过缩进来代替标记,减少了多余标记的输入,使模板文件更加简洁易读。下面将详细讲解Jade标签的基本写法。 在Jade模板中,元素的标签名不需要使用尖角号和结束标记,而是使用缩进的方式来表示嵌套。例如,以下代码用Jade来表示一个div元素: div 这里的div就代表了一个<div>标签。 在…

    Vue 2023年5月28日
    00
  • 基于Vue单文件组件详解

    基于Vue单文件组件详解 什么是单文件组件 单文件组件是Vue框架中常用的组件化开发方式。它将组件的HTML模板、JavaScript逻辑和CSS样式整合到同一个文件中,更加方便管理和开发。 单文件组件的优点 结构清晰:单文件组件将组件的”三大件“整合到一起,代码结构更加清晰; 复用性高:单文件组件可以被其他组件复用,提高代码的复用性; 可维护性强:单文件组…

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