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实现让某个动作延迟几秒执行

    实现动作延迟执行可以通过JavaScript语言中提供的setTimeout()函数来实现。 该函数的语法为: setTimeout(function, delay) 其中“function”参数是需要执行的函数名或函数体,delay参数是延迟的时间,单位是毫秒。 下面给出两个示例来讲解该函数如何实现动作延迟执行: 示例一:实现3秒钟后弹窗提示 可以使用以下…

    JavaScript 2023年6月11日
    00
  • .NET使用js制作百度搜索下拉提示效果(不是局部刷新)实现思路

    下面是详细的“.NET使用js制作百度搜索下拉提示效果(不是局部刷新)实现思路”的攻略: 思路概述 将百度搜索框封装入input标签内,并加上id=”searchInput”属性,这样方便后续的DOM操作。 使用JavaScript监听输入框内容(keyup事件),当用户输入触发事件后,发送AJAX请求给百度服务器,获取搜索结果。 接收到结果后,将结果显示到…

    JavaScript 2023年6月11日
    00
  • 什么是DOM(Document Object Model)文档对象模型

    DOM (Document Object Model,文档对象模型)是一种表示 HTML 和 XML 文档的标准程序接口。通过使用 DOM,可以访问和操作一个文档中的内容。DOM 描述了一个层次化的节点树,允许开发人员添加、修改或删除文档中的任意部分。 DOM 模型分为三个部分:文档结构模型(Document),元素对象模型(Element)和特性对象模型(…

    JavaScript 2023年6月10日
    00
  • TreeNodeCheckChanged事件触发方法代码实例

    对于.NET平台中的TreeView控件,其中的节点是否被勾选的状态会影响到整棵树的结构和数据,为此,TreeView提供了一个名为TreeNodeCheckChanged的事件,可以监听节点是否被勾选或者取消勾选的状态变化。以下是详细的介绍和示例说明。 TreeNodeCheckChanged事件简介 事件说明 TreeNodeCheckChanged是T…

    JavaScript 2023年6月11日
    00
  • 利用js动态添加删除table行的示例代码

    当需要在网页中展示和处理数据时,使用table是一种非常常见的方式。在一些场景下,需要动态地添加或删除表格行,这就需要使用JavaScript进行操作。下面是一份利用js动态添加删除table行的示例代码攻略。 1. HTML结构 首先,我们需要在HTML中定义一个table,标记好每一列的thead和tbody,并预留出一行作为模板行。 <table…

    JavaScript 2023年6月11日
    00
  • 浅谈JavaScript中你可能不知道URL构造函数的属性

    我们来详细讲解一下“浅谈JavaScript中你可能不知道URL构造函数的属性”的攻略。 1. 什么是URL构造函数 URL 构造函数是一种可用于创建、解析和序列化 URL 的 JavaScript 包装器。在浏览器中,它通常作为 window.URL 和 window.location 对象的属性使用。在其他上下文中,可以使用全局 URL() 构造函数或者…

    JavaScript 2023年6月11日
    00
  • 详解JS中统计函数执行次数与执行时间

    首先我们需要明确一下,统计函数执行次数和执行时间是一个常见的需求,它有助于我们优化代码,找到潜在的性能瓶颈,提高应用程序的性能。那么,在JS中如何统计函数执行次数和执行时间呢? 统计函数执行次数 我们可以定义一个计数器来记录函数执行的次数。例如,下面的代码演示了如何统计函数foo的执行次数: let count = 0; function foo() { /…

    JavaScript 2023年5月27日
    00
  • 28个JS验证函数收集

    下面是对“28个JS验证函数收集”的完整攻略的详细讲解。 1. 前言 在Web开发中,常常需要对用户输入的数据进行验证,避免用户输入不合法的数据导致应用程序的异常,而JavaScript是前端验证的绝佳工具。在实现验证功能时,不必每次都从头开始编写代码,可以参考已有的验证函数库,例如这篇文章介绍的“28个JS验证函数收集”。 2. 了解验证函数库 这份验证函…

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