JavaScript的原型与对象

JavaScript的原型

JavaScript这个名词最初就是因为Java太火了,为了蹭Java的热度所以起的名字,并且JavaScript的管理层要求它去模仿Java,所以他有很多地方跟Java相像,但是因为他们的设计不一样,所以在我学习的时候会有很多迷惑的地方,比如这里原型的概念。

Java、C++这一类的语言属于基于类的编程语言。这种类型的编程语言关注分类和类之间关系的开发模型,在这种语言中,总是先有类,再通过类实例化一个对象,类之间可以有继承,组合之类的关系。

JavaScript是属于基于原型的编程语言,更加关注对象实例的行为,是通过"复制操作"创建一个新对象。并不是真正的去复制一个原型对象,而是使新对象持有一个原型的引用。

抛去模拟Java类的操作语法(new、Function Object等),JavaScript的原型系统可以简单的来说就是对象的私有字段[[prototype]]就是对象的原型,读取一个属性,如果对象本身没有,就会访问对象的原型,直到找到或者原型为空为止。

在ES6之后,我们可以通过一些内置函数来才操纵原型:

  • Object.create 根据指定的原型创建新对象
  • Object.getPrototypeOf 获得一个对象的原型
  • Object.setPrototypeOf 设置一个对象的原型

JavaScript的对象

可以分为这么几类

  • 宿主对象(host Objects): 由JavaScript宿主环境提供的对象,这些对象的行为完全由宿主环境决定
  • 内置对象(Built-in objects):由JavaScript语言提供的对象
    • 固有对象(Intrinsic Objects): 由标准规定,随着JavaScript运行时创建而自动创建的对象实例
  • 原生对象(Native Objects):可以由用户通过Array,Date等内置构造器或者特殊语法创建的对象
  • 普通对象(Ordinary Objects): 由{}语法、Object构造器或者class关键字定义类创建的对象,能够被原型继承。

宿主对象

宿主对象(Host Objects)是指由宿主环境(如浏览器或Node.js)提供的对象。这些对象不是ECMAScript规范中定义的对象,而是由特定的宿主环境定义和提供的。因此,宿主对象的特性和行为可能会有所不同,取决于它们所嵌入的环境。

  1. 浏览器环境中的宿主对象:

    • Window对象: 表示浏览器窗口或标签页。全局作用域中的变量和函数都是Window对象的属性和方法。
    • Document对象: 表示HTML文档,提供对文档内容的访问和操作。
    • Navigator对象: 提供有关浏览器的信息,如用户代理字符串等。
    • XMLHttpRequest对象: 用于在后台与服务器交换数据,是AJAX操作的基础。
    • Event对象: 表示事件,例如鼠标点击或键盘按键。
  2. Node.js环境中的宿主对象:

    • Global对象: 在Node.js中代表全局命名空间,类似于浏览器环境中的Window对象。
    • Process对象: 提供与当前进程相关的信息和控制。
    • Buffer对象: 用于处理二进制数据。
    • Module对象: 表示模块,用于导出和导入模块中的内容。

内置对象

是指由语言规范定义的对象,这些对象在任何支持JavaScript的环境中都是可用的。

固有对象

在JavaScript中,固有对象(Intrinsic Objects)是指与JavaScript语言紧密相关、由JavaScript引擎提供并在所有环境中可用的对象。这些对象直接由JavaScript引擎实现,而不是由宿主环境(如浏览器或Node.js)提供。固有对象通常是ECMAScript规范的一部分,因此在所有JavaScript环境中都是一致的。

以下是一些常见的固有对象及其一些基本方法的简单表格表示:

对象 描述 一些方法
Object 所有对象的基础,包括一些基本的对象操作方法。 Object.create(), Object.defineProperty()
Function 表示JavaScript中的函数。 Function.prototype.call(), Function.prototype.apply()
Array 用于表示数组。 Array.prototype.forEach(), Array.prototype.map()
String 用于表示字符串。 String.prototype.length, String.prototype.indexOf()
Boolean 表示布尔值。 -
Number 表示数字。 Number.prototype.toFixed(), Number.prototype.toString()
Symbol 表示唯一的标识符。 -
Error 表示运行时错误的基础对象。 Error.prototype.message, Error.prototype.stack
RegExp 表示正则表达式。 RegExp.prototype.test(), RegExp.prototype.exec()
Date 用于处理日期和时间。 Date.prototype.getDate(), Date.prototype.setTime()

原生对象

指的是由语言规范定义的内置对象和用户定义的对象,这两者都是由 JavaScript 本身提供的。与"宿主对象"不同,原生对象并不依赖于宿主环境,它们是 JavaScript 语言本身的一部分。

原生对象包括 ECMAScript 规范中定义的内置对象(如 Array、Object、Function 等)以及用户在代码中创建的对象。

  1. 内置对象: 上面举了一些例子

  2. 用户定义的对象:

    • 自定义构造函数: 可以使用构造函数创建自定义对象。例如,通过构造函数可以创建具有特定属性和方法的对象。
    js 复制代码
    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
    
    const person1 = new Person("Alice", 25);
    • 字面量方式创建对象: 使用对象字面量 {} 可以直接创建对象。
    js 复制代码
    const car = {
      brand: "Toyota",
      model: "Camry",
      year: 2022,
    };

普通对象

是 JavaScript 中最基本、最常见的对象类型之一。它们是由对象字面量({})或 Object 构造函数创建的对象。普通对象不属于特殊的对象类型(如数组、函数、正则表达式等),而是用于存储键值对的一般用途对象。

创建普通对象的方式有两种:

  • 对象字面量: 使用花括号 {} 直接创建对象。
js 复制代码
const person = {
    name: "John",
    age: 30,
    job: "Developer"
};
  • Object 构造函数: 使用 new Object() 构造函数创建对象。
js 复制代码
const person = new Object();
person.name = "John";
person.age = 30;
person.job = "Developer";
相关推荐
文心快码BaiduComate12 分钟前
WAVE SUMMIT深度学习开发者大会2025举行 文心大模型X1.1发布
前端·后端·程序员
babytiger12 分钟前
python 通过selenium调用chrome浏览器
前端·chrome
passer98118 分钟前
基于webpack的场景解决
前端·webpack
华科云商xiao徐25 分钟前
Java并发编程常见“坑”与填坑指南
javascript·数据库·爬虫
奶昔不会射手32 分钟前
css3之grid布局
前端·css·css3
举个栗子dhy35 分钟前
解决在父元素上同时使用 onMouseEnter和 onMouseLeave时导致下拉菜单无法正常展开或者提前收起问题
前端·javascript·react.js
Coding_Doggy42 分钟前
苍穹外卖前端Day1 | vue基础、Axios、路由vue-router、状态管理vuex、TypeScript
前端
前端与小赵42 分钟前
vue3和vue2生命周期的区别
前端·javascript·vue.js