首页 > 编程语言 >JavaScript 中的“造物”艺术:对象、构造函数与原型

JavaScript 中的“造物”艺术:对象、构造函数与原型

时间:2024-11-26 15:00:17浏览次数:8  
标签:JavaScript name 对象 age 造物 Person new 构造函数

走进JS,走近讶语

在JavaScript的世界里,对象和面向对象编程(OOP)是不可或缺的一部分。本文将带你深入了解JavaScript中对象的创建方式,特别是ES6中引入的class语法,以及传统的构造函数和原型的概念。希望通过这篇文章,你能对JavaScript的面向对象编程有一个更深入的理解。

1. 造对象

在JavaScript中,创建对象有多种方式,每种方式都有其特点和适用场景。

1.1 对象字面量

对象字面量是最简单、最直接的方式,适合创建简单的对象。


javascript

代码解读

复制代码

const person = { name: 'Alice', age: 25, greet: function() { console.log(`Hello, my name is ${this.name}`); } }; person.greet(); // 输出: Hello, my name is Alice

虽然这种方式简单易用,但它缺乏灵活性,不适合创建多个具有相同属性和方法的对象。

1.2 ES6 Class 语法

ES6引入了class关键字,使得JavaScript的面向对象编程更加直观和易于理解。


javascript

代码解读

复制代码

class Person { constructor(name, age) { this.name = name; this.age = age; } greet() { console.log(`Hello, my name is ${this.name}`); } } const alice = new Person('Alice', 25); alice.greet(); // 输出: Hello, my name is Alice

class语法不仅封装了属性和方法,还提供了构造函数、继承等高级特性,是目前最常用的面向对象编程方式。

1.3 类的本质

类是抽象的概念,用于封装属性和方法。类实际上是模板,定义了一组对象的共同特征和行为。与对象字面量相比,类提供了更好的组织和复用性。

2. 构造函数

在ES5及之前,JavaScript并没有class关键字,而是通过构造函数来实现面向对象编程。

2.1 构造函数的基本概念

构造函数是一种特殊的函数,用于创建和初始化对象。构造函数的首字母通常大写,以区别于普通函数。


javascript

代码解读

复制代码

function Person(name, age) { this.name = name; this.age = age; } const bob = new Person('Bob', 30); console.log(bob); // 输出: Person { name: 'Bob', age: 30 }

在构造函数中,this关键字指向新创建的实例对象。通过new运算符调用构造函数,可以完成对象的实例化过程。

2.2 构造函数 vs 普通函数

函数是否为构造函数,不是由首字母大写决定的,而是由new运算符决定的。首字母大写只是编程风格上的约定,有助于提高代码的可读性。


javascript

代码解读

复制代码

function Person(name, age) { this.name = name; this.age = age; console.log(this); // 输出当前实例化对象 } // 使用new运算符调用构造函数 const alice = new Person('Alice', 25); // 不使用new运算符,直接调用函数 Person('Charlie', 40); // 这样调用不会创建新的实例对象

输出示例:

分析:

  • 使用 new 运算符:构造函数会创建一个新的实例对象,并将 this 绑定到这个新对象上。
  • 不使用 new 运算符:构造函数会将 this 绑定到全局对象上,导致属性被添加到全局对象上,而不是创建一个新的实例对象。
3. 原型

在JavaScript中,函数也是对象,每个函数对象都有一个prototype属性,用于存储所有实例共享的属性和方法。

3.1 原型的基本概念

通过原型,可以实现方法的共享,减少内存占用,因为如果把方法也书写在构造函数体内,随着创建的实例对象越来越多, 会造成额外的资源浪费。


javascript

代码解读

复制代码

function Person(name, age) { this.name = name; this.age = age; } // 在原型上定义方法 Person.prototype.greet = function() { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person('Alice', 25); alice.greet(); // 输出: Hello, my name is Alice

3.2 类的方法部分由原型完成

在ES6的class语法中,类的方法实际上也是定义在原型上的,


javascript

代码解读

复制代码

class Person { constructor(name, age) { this.name = name; this.age = age; } greet() { console.log(`Hello, my name is ${this.name}`); } } const alice = new Person('Alice', 25); alice.greet(); // 输出: Hello, my name is Alice

4. 三者关系

在JavaScript中,构造函数、原型对象和实例对象之间有着密切的关系。

  • 构造函数:用于创建和初始化对象。
  • 原型对象:存储所有实例共享的属性和方法。
  • 实例对象:通过new运算符创建,拥有自己的属性,同时可以访问原型对象上的方法。

javascript

代码解读

复制代码

function Person(name, age) { this.name = name; this.age = age; } Person.prototype.greet = function() { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person('Alice', 25); console.log(alice); // 输出: Person { name: 'Alice', age: 25 } // 实例对象先在自己身上查找属性,找不到再去原型对象上查找 alice.greet(); // 输出: Hello, my name is Alice

5. JavaScript的面向对象设计哲学

JavaScript的面向对象编程是基于原型的,而不是传统的类继承。这种设计哲学类似于中国人以孔子为原型,强调的是对象之间的关联和共享,而不是严格的类层次结构。


javascript

代码解读

复制代码

const kobe = { name: 'Kobe Bryant', playBasketball: function() { console.log(`${this.name} is playing basketball`); } }; function Player(name) { this.name = name; } Player.prototype = kobe; const leBron = new Player('LeBron James'); leBron.playBasketball(); // 输出: LeBron James is playing basketball

为什么输出的是 LeBron James 而不是 Kobe Bryant

  1. 实例对象的属性优先级

    • 当你调用 leBron.playBasketball() 时,JavaScript 引擎会首先在 leBron 对象本身上查找 playBasketball 方法。
    • 如果在 leBron 对象上没有找到 playBasketball 方法,它会沿着原型链向上查找。
  2. 原型链的作用

    • leBron 的原型对象是 kobe,因为我们在 Player 构造函数中设置了 Player.prototype = kobe
    • 因此,当在 leBron 上找不到 playBasketball 方法时,JavaScript 引擎会在 kobe 对象上查找该方法。
  3. this 的绑定

    • 在 playBasketball 方法中,this 指向的是调用该方法的对象,即 leBron
    • 因此,this.name 实际上是 leBron.name,而不是 kobe.name

总结

通过本文的介绍,相信你对JavaScript中对象的创建方式、构造函数、原型以及面向对象的设计哲学有了更深入的理解。无论是使用对象字面量、构造函数还是ES6的class语法,都能根据具体需求选择合适的方式来实现面向对象编程。

标签:JavaScript,name,对象,age,造物,Person,new,构造函数
From: https://blog.csdn.net/2401_89221704/article/details/144058202

相关文章

  • 如何在CodeIgniter中调用构造函数
    在CodeIgniter框架中,调用构造函数的方式与其他PHP类中的方式相同。在CodeIgniter中,通常你会在控制器(Controller)中调用构造函数,用于初始化一些属性或执行一些启动时的任务。下面是一个简单的例子,展示了如何在CodeIgniter控制器中调用构造函数:通过上述步骤,你可以在CodeIgnite......
  • 第十章JavaScript的应用
    10.1JavaScript概述10.1.1JavaScript简介JavaScript是一种基于对象(0bject)和事件驱动(EventDriven)并具有安全性能的脚本语言,能够与HTML(超文本标记语言)、Java语言一起在Web页面中与Web客户交互它无须经过先将数据传给服务器端(Server)、再传回来的过程,而直接可以由客......
  • JavaScript 编程精解(Eloquent)第四版·翻译完成
    JavaScript编程精解(Eloquent)第四版第一章:引言第一部分:语言第二章:值、类型和运算符第三章:程序结构第四章:函数第五章:数据结构:对象和数组第六章:高阶函数第七章:对象的秘密生活第八章:项目:一个机器人第九章:漏洞和错误第十章:正则表达式第十一章:模......
  • [Javascript] About private access (Object.getOwnPropertySymbols)
    Wehaveamodule:constkey=Symbol('key')exportclassA{[key]=1value(){console.log(this[key])}}Itseemsthat keyisnotexposetooutsideofmodule,butstillweareabletogetit.import{A}from'./mod......
  • [Javascript] Encapsulate chunk operation
    functionmain(){constdatas=newArray(10000).fill(null).map((_,i)=>i)functiontaskHanlder(_,i){console.log(i)}performChunkNode(datas,taskHanlder)}main()functionperformChunk(datas,task,scheduler){if......
  • 第十章JavaScript的应用
    10.1JavaScript概述10.1.1JavaScript简介JavaScript是一种基于对象(0bject)和事件驱动(EventDriven)并具有安全性能的脚本语言,能够与HTML(超文本标记语言)、Java语言一起在Web页面中与Web客户交互它无须经过先将数据传给服务器端(Server)、再传回来的过程,而直接可以......
  • JavaScript中数组知识点
    数组数组这种数据类型可以在一个变量里保存多个值,每个值都有一个数值索引,而且能够保存任何数据类型(比如布尔值、数值、字符串、函数、对象),甚至能够保存其他数组。我们可以通过引用数组的数字索引来访问任何的项,这个索引和项在数组中的位置是对应的。通常,我们把数组中的项称......
  • 盘点2个.Net版本的JavaScript执行引擎
    https://zhuanlan.zhihu.com/p/692270642 推荐2个JavaScript开源引擎,方便在C#执行JavaScript脚本。1、jurassicJurassic是一个开源的托管JavaScript执行引擎,使用MS-PL授权协议。它的目标是成为.NET平台上功能最强,最为标准的JavaScript引擎。功能强大:支持ECMAScript3和ECMAS......
  • JavaScript核心语法(3)
    前两篇文章大概把JavaScript的基础语法讲了一下,这篇文章主要讲讲ES6的核心语法。ES6的核心语法说实话其实有点多,我重点挑一些经常在项目中用到的来讲,其他一些我没怎么见过的就不讲了。目录1.变量和常量变量(let 和 var)varlet常量(const)总结2.箭头函数语法示例特性和......
  • [Javascript] Import the Same JavaScript Module Multiple Times with Cache Busting
    WhenattemptingtoloadthesamemoduletwiceinJavaScriptyou'llhitacacheandcodewon'tre-run.Inscenarioswhereyouactuallydowanttohavestateinyourmodules,you'llhavetouseacache-bustingtechniquebypassingaquerypar......