JavaScript原型对象、构造函数和实例对象功能与用法详解

JavaScript原型对象、构造函数和实例对象功能与用法详解

前言

在讲解 JavaScript 原型对象、构造函数和实例对象之前,我们需要先了解几个概念:

  • 属性:包括原型对象和实例对象的属性,以及函数对象的属性
  • 方法:包括原型对象和实例对象的方法,以及函数对象的方法
  • 原型:每个 JavaScript 对象都有一个原型对象,用于继承属性和方法
  • 构造函数:用于创建实例对象的函数
  • 实例对象:通过构造函数创建出来的对象,可以使用原型对象的属性和方法

原型对象

JavaScript 对象有一个特殊的属性 __proto__,称为原型对象。每个对象都有一个原型对象,除了 null,而原型对象也是对象,因此它也有一个原型对象,一直到 Object.prototype,它是原型链的顶端。

在对象属性或方法查找时,如果对象本身没有该属性或方法,就会自动去它的原型对象中查找。我们常用的原型对象是函数的原型对象,每个函数都有一个原型对象,默认情况下它的 constructor 指向该函数本身。

function Person() {}
Person.prototype.name = "Alice";
Person.prototype.sayHello = function() {
    console.log("Hello, I'm " + this.name + ".");
};

var person = new Person();
person.sayHello();  // Hello, I'm Alice.

在上面的例子中,Person.prototype 是一个原型对象,它有两个属性:namesayHelloPerson 通过 new 关键字创建了一个实例对象 person,它继承了 Person.prototype 的所有属性和方法。因此 person 也有 namesayHello 两个属性和方法。

构造函数

构造函数是一种特殊的函数,它被用来创建实例对象。在 JavaScript 中,构造函数与普通函数的区别是通过 new 关键字调用,而普通函数可以直接调用。另外,构造函数一般用大写字母开头。

每个构造函数都有一个 prototype 属性,它是一个原型对象,也是该构造函数创建的所有实例对象的原型对象。在构造函数中定义的属性和方法都会被该构造函数创建的实例对象所继承。

function Person(name, gender) {
    this.name = name;
    this.gender = gender;
}
Person.prototype.sayHello = function() {
    console.log("Hello, I'm " + this.name + ".");
};

var person1 = new Person("Alice", "female");
var person2 = new Person("Bob", "male");
person1.sayHello();  // Hello, I'm Alice.
person2.sayHello();  // Hello, I'm Bob.

在上述例子中,Person 是一个构造函数,它有两个参数 namegender,并且在函数中用 this 关键字定义了两个实例属性。sayHelloPerson.prototype 的一个方法,因此所有通过 Person 创建的实例对象都可以使用 sayHello 方法。

实例对象

实例对象是通过构造函数 new 关键字创建出来的对象。每个实例对象都有一个 __proto__ 属性,它指向该实例对象所属的构造函数的原型对象。

function Person(name, gender) {
    this.name = name;
    this.gender = gender;
}
Person.prototype.sayHello = function() {
    console.log("Hello, I'm " + this.name + ".");
};

var person1 = new Person("Alice", "female");
var person2 = new Person("Bob", "male");
console.log(person1.__proto__ === Person.prototype);  // true
console.log(person2.__proto__ === Person.prototype);  // true

在上述例子中,person1person2 都是 Person 的实例对象,它们都有一个 __proto__ 属性,指向 Person.prototype

实例对象所具有的属性和方法,来自于它所属的构造函数的原型对象和实例自身定义的属性和方法。

示例说明

示例一:原型对象属性和方法的继承

function Student(name, grade) {
    this.name = name;
    this.grade = grade;
}
Student.prototype.sayHi = function() {
    console.log(`Hi, my name is ${this.name}, and I'm in grade ${this.grade}.`);
}

function Teacher(name, subject) {
    this.name = name;
    this.subject = subject;
}
Teacher.prototype = new Student();
Teacher.prototype.sayHi = function() {
    console.log(`Hello, my name is ${this.name}, and I teach ${this.subject}.`);
}

var student = new Student("Alice", 5);
var teacher = new Teacher("Bob", "Mathematics");

student.sayHi();  // Hi, my name is Alice, and I'm in grade 5.
teacher.sayHi();  // Hello, my name is Bob, and I teach Mathematics.

在该示例中,Student 是一个构造函数,它有两个属性 namegrade,还有一个原型方法 sayHiTeacher 是从 Student 派生的一个构造函数,它定义了一个属性 subject

Teacher.prototype 中,将它的原型对象设置为 Student.prototype,这样 Teacher 也就继承了 Student 的属性和方法,包括 sayHi 方法。在 Teacher.prototype 中重写了 sayHi 方法,保留了 name 属性,并新增了 subject 属性。

创建了 studentteacher 两个实例对象,它们分别使用了 Student.prototypeTeacher.prototypesayHi 方法,表现出不同的行为。

示例二:实例对象属性的修改

function Car(brand, price) {
    this.brand = brand;
    this.price = price;
}
Car.prototype.drive = function() {
    console.log(`Driving a ${this.brand} car, priced at ${this.price} dollars.`);
}

var car = new Car("Toyota", 20000);
car.drive();  // Driving a Toyota car, priced at 20000 dollars.

car.brand = "Honda";
car.price = 25000;
car.drive();  // Driving a Honda car, priced at 25000 dollars.

在该示例中,我们定义了一个 Car 构造函数,它有两个属性 brandprice,还定义了一个原型方法 drive,用于输出车辆相关信息。

创建了一个实例对象 car,并调用了 drive 方法,输出了车辆的信息。接着,我们通过修改 car 对象的 brandprice 属性,再次调用了 drive 方法,显示了修改后的信息。

这个例子展示了实例对象的属性可以修改,并且在调用方法时能够输出更新后的信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript原型对象、构造函数和实例对象功能与用法详解 - Python技术站

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

相关文章

  • JS幻想 读取二进制文件第2/2页

    浏览器中读取二进制文件需要使用 FileReader 和 Blob 对象。下面介绍一下具体的操作步骤。 步骤一:获取文件 通过文件选择器或者其他方式获取二进制文件的实例。可以使用 <input> 标签加上 accept 属性来实现文件选择器。 <input type="file" accept=".bin&qu…

    JavaScript 2023年5月27日
    00
  • js左右弹性滚动对联广告代码分享

    下面是 js 左右弹性滚动对联广告代码分享的攻略: 一、代码实现思路 实现 js 左右弹性滚动对联广告的代码,整体思路如下: 使用 CSS 布局将广告左右对联 使用 JavaScript 监测浏览器窗口大小,以动态设置广告左右对联的位置 实现左右弹性滚动效果,让广告在页面上滑动 下面将分别讲解具体的实现过程。 二、HTML 结构 首先需要在 HTML 文件中…

    JavaScript 2023年6月11日
    00
  • JavaScript实现两个数组的交集

    请参考以下完整攻略: 问题描述 如何用JavaScript实现两个数组的交集? 解决方案 下面提供几种常见的解决方法。 方法一:双重循环法 最基本的方法就是使用双重循环,比较两个数组中的每个元素,找出相同的元素。这种方法优点在于思路简单,容易理解,缺点在于时间复杂度较高,当数组规模较大时性能很差。 const arr1 = [1, 3, 5, 7, 9]; …

    JavaScript 2023年5月27日
    00
  • 大幅提升前端工作效率!Numeral.js数值格式化库来了!

    我们日常开发中,时常会碰到数值格式化操作的场景,今天了不起就为大家分享一款相对比较全面的数值格式化的JS库:Numeral.js Numeral.js Numeral.js 是一个用来对数值进行操作和格式化的 JS 库。可将数字格式化为货币、百分比、时间,甚至是序数词的缩写(比如1st,100th)。 安装 下载到本地引入 <script src=”n…

    JavaScript 2023年5月10日
    00
  • JavaScript Math.floor方法(对数值向下取整)

    JavaScript Math.floor方法 Math.floor() 方法会返回小于等于所传参数的最大整数。 语法 Math.floor(x) 参数 x:必需。一个数值,将被下舍入为整数。 返回值 返回小于等于 x 的最大整数。 示例1:向下取整 var a = Math.floor(4.3); // 4 var b = Math.floor(9.999…

    JavaScript 2023年5月28日
    00
  • JS操作XML实例总结(加载与解析XML文件、字符串)

    加载与解析XML文件、字符串是JS操作XML的重要部分,本文将为您详细讲解如何完成此操作。 加载XML文件 使用XMLHttpRequest对象,可以向服务器请求XML文件并返回。具体步骤如下: 创建XMLHttpRequest对象 var xhr = new XMLHttpRequest(); 打开XML文件 xhr.open(“GET”, “exampl…

    JavaScript 2023年5月27日
    00
  • Javascript数组循环遍历之forEach详解

    Javascript数组循环遍历之forEach详解 foreEach()方法的基本使用 JavaScript中的数组可以使用forEach()方法进行遍历,forEach()方法接收一个函数作为参数,该函数将在数组中的每个元素上运行,基本语法如下: array.forEach(function(currentValue, index, arr), this…

    JavaScript 2023年5月27日
    00
  • 简单聊聊Js中的常见错误类型

    简单聊聊Js中的常见错误类型 在Js编程中,我们不可避免地会遇到各种类型的错误。了解这些错误类型及其产生的原因,可以帮助我们更快速地定位错误并解决问题。下面就让我们来简单聊聊Js中的常见错误类型。 1. 引用错误(ReferenceError) 引用错误通常发生在引用未定义的变量或函数时。例如: console.log(a); // Uncaught Ref…

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