JavaScript 对象与原型

目录

[JavaScript 对象创建方式详解](#JavaScript 对象创建方式详解)

[1.1 构造函数创建对象](#1.1 构造函数创建对象)

[1.2 对象字面量创建对象](#1.2 对象字面量创建对象)

[1.2.1 基本语法](#1.2.1 基本语法)

[1.2.2 访问对象成员](#1.2.2 访问对象成员)

[1.2.3 遍历对象属性](#1.2.3 遍历对象属性)

[1.2.4 this 关键字](#1.2.4 this 关键字)

[1.3 工厂模式创建对象](#1.3 工厂模式创建对象)

[1.4 构造函数模式](#1.4 构造函数模式)

[1.4.1 基本用法](#1.4.1 基本用法)

[1.4.2 new 的执行过程](#1.4.2 new 的执行过程)

[1.4.3 优化方法定义](#1.4.3 优化方法定义)

[1.5 原型模式](#1.5 原型模式)

[1.5.1 原型对象](#1.5.1 原型对象)

[1.5.2 原型链](#1.5.2 原型链)

[1.6 垃圾回收](#1.6 垃圾回收)

[1.7 ES6 Class 语法](#1.7 ES6 Class 语法)

[JavaScript 对象创建方式详解](#JavaScript 对象创建方式详解)

[1.1 构造函数创建对象](#1.1 构造函数创建对象)

[1.2 对象字面量创建对象](#1.2 对象字面量创建对象)

[1.2.1 基本语法](#1.2.1 基本语法)

[1.2.2 访问对象成员](#1.2.2 访问对象成员)

[1.2.3 遍历对象属性](#1.2.3 遍历对象属性)

[1.2.4 this 关键字](#1.2.4 this 关键字)

[1.3 工厂模式创建对象](#1.3 工厂模式创建对象)

[1.4 构造函数模式](#1.4 构造函数模式)

[1.4.1 基本用法](#1.4.1 基本用法)

[1.4.2 new 的执行过程](#1.4.2 new 的执行过程)

[1.4.3 优化方法定义](#1.4.3 优化方法定义)

[1.5 原型模式](#1.5 原型模式)

[1.5.1 原型对象](#1.5.1 原型对象)

[1.5.2 原型链](#1.5.2 原型链)

[1.6 垃圾回收](#1.6 垃圾回收)

[1.7 ES6 Class 语法](#1.7 ES6 Class 语法)


JavaScript 对象创建方式详解

1.1 构造函数创建对象

使用 new Object() 构造函数创建对象是最基础的方式:

js 复制代码
var obj = new Object();
obj.name = "张三";
obj.gender = "男";
obj.age = 18;

特点:

  • 使用 new 关键字调用构造函数
  • 语法较为冗长
  • 主要用于理解对象的基本概念

1.2 对象字面量创建对象

1.2.1 基本语法

对象字面量提供更简洁的创建方式:

js 复制代码
var obj = {
  name: "猪八戒",
  age: 28,
  gender: "男",
  sayHi: function() {
    console.log("hi~");
  }
};

注意事项:

  • 采用键值对形式定义属性
  • 多个属性间用逗号分隔
  • 方法本质上是匿名函数

1.2.2 访问对象成员

js 复制代码
// 点语法访问
console.log(obj.name);
// 方括号访问
console.log(obj["age"]);
// 调用方法
obj.sayHi();

1.2.3 遍历对象属性

使用 for...in 循环遍历对象:

js 复制代码
for (var prop in obj) {
  console.log(`属性名:`+n);
  console.log(`属性值:`obj[n]);
}

1.2.4 this 关键字

this 的指向规则:

  1. 函数调用:指向 window
  2. 方法调用:指向调用对象
  3. 构造函数调用:指向新对象
js 复制代码
function showName() {
  console.log(this.name);
}

var obj1 = { name: "孙悟空", show: showName };
var obj2 = { name: "沙和尚", show: showName };

showName();    // 全局
obj1.show();   // 孙悟空
obj2.show();   // 沙和尚

1.3 工厂模式创建对象

解决批量创建对象问题:

js 复制代码
function createPerson(name, age) {
  var obj = new Object();
  obj.name = name;
  obj.age = age;
  return obj;
}
  var obj2=createPerson("猪八戒",28,"男");
  var obj3=createPerson("沙和尚",38,"男");
  var obj4=createPerson("白骨精",18,"女");

1.4 构造函数模式

1.4.1 基本用法

js 复制代码
function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHi = function() {
    console.log("Hi");
  };
}

var p1 = new Person("张三", 20);

特点:

  • 首字母大写约定
  • 必须使用 new 调用
  • 通过 this 添加成员

1.4.2 new 的执行过程

  1. 创建新对象
  2. 绑定 this
  3. 执行构造函数
  4. 返回对象

1.4.3 优化方法定义

将方法提取到外部避免重复创建:

js 复制代码
function sayHi() {
  console.log("Hi");
}

function Person(name) {
  this.name = name;
  this.sayHi = sayHi;
}

1.5 原型模式

1.5.1 原型对象

js 复制代码
function Person() {}
Person.prototype.name = "张三";
Person.prototype.sayHi = function() {
  console.log("Hi");
};

特点:

  • 所有实例共享原型成员
  • 方法只需定义一次

1.5.2 原型链

属性查找顺序:

  1. 对象自身
  2. 原型对象
  3. Object.prototype
  4. null

1.6 垃圾回收

JavaScript 自动管理内存:

js 复制代码
var obj = new Object();
// 解除引用
obj = null;

1.7 ES6 Class 语法

js 复制代码
class Person {
  constructor(name) {
    this.name = name;
  }
  
  sayHi() {
    console.log(`Hi, ${this.name}`);
  }
}

特点:

  • 语法更简洁
  • 本质仍是构造函数+原型
  • 方法自动添加到原型

JavaScript 对象创建方式详解

1.1 构造函数创建对象

使用 new Object() 构造函数创建对象是最基础的方式:

js 复制代码
var obj = new Object();
obj.name = "张三";
obj.gender = "男";
obj.age = 18;

特点:

  • 使用 new 关键字调用构造函数
  • 语法较为冗长
  • 主要用于理解对象的基本概念

1.2 对象字面量创建对象

1.2.1 基本语法

对象字面量提供更简洁的创建方式:

js 复制代码
var obj = {
  name: "猪八戒",
  age: 28,
  gender: "男",
  sayHi: function() {
    console.log("hi~");
  }
};

注意事项:

  • 采用键值对形式定义属性
  • 多个属性间用逗号分隔
  • 方法本质上是匿名函数

1.2.2 访问对象成员

js 复制代码
// 点语法访问
console.log(obj.name);
// 方括号访问
console.log(obj["age"]);
// 调用方法
obj.sayHi();

1.2.3 遍历对象属性

使用 for...in 循环遍历对象:

js 复制代码
for (var prop in obj) {
  console.log(`属性名:${prop}`);
  console.log(`属性值:${obj[prop]}`);
}

1.2.4 this 关键字

this 的指向规则:

  1. 函数调用:指向 window
  2. 方法调用:指向调用对象
  3. 构造函数调用:指向新对象
js 复制代码
function showName() {
  console.log(this.name);
}

var obj1 = { name: "孙悟空", show: showName };
var obj2 = { name: "沙和尚", show: showName };

showName();    // 全局
obj1.show();   // 孙悟空
obj2.show();   // 沙和尚

1.3 工厂模式创建对象

解决批量创建对象问题:

js 复制代码
function createPerson(name, age) {
  var obj = new Object();
  obj.name = name;
  obj.age = age;
  return obj;
}

缺点:

使用工厂方法创建的对象,使用的构造函数都是Object

所以创建的对象都是Object这个类型

就导致我们无法区分多种不同类型的对象

1.4 构造函数模式

1.4.1 基本用法

js 复制代码
function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHi = function() {
    console.log("Hi");
  };
}

var p1 = new Person("张三", 20);

特点:

  • 首字母大写约定
  • 必须使用 new 调用
  • 通过 this 添加成员

1.4.2 new 的执行过程

  1. 创建新对象
  2. 绑定 this
  3. 执行构造函数
  4. 返回对象

1.4.3 优化方法定义

将方法提取到外部避免重复创建:

js 复制代码
function sayHi() {
  console.log("Hi");
}

function Person(name) {
  this.name = name;
  this.sayHi = sayHi;
}

1.5 原型模式

1.5.1 原型对象

js 复制代码
function Person() {}
Person.prototype.name = "张三";
Person.prototype.sayHi = function() {
  console.log("Hi");
};

特点:

  • 所有实例共享原型成员
  • 方法只需定义一次

1.5.2 原型链

属性查找顺序:

  1. 对象自身
  2. 原型对象
  3. Object.prototype
  4. null

1.6 垃圾回收

JavaScript 自动管理内存:

js 复制代码
var obj = new Object();
// 解除引用
obj = null;

1.7 ES6 Class 语法

js 复制代码
class Person {
  constructor(name) {
    this.name = name;
  }
  
  sayHi() {
    console.log(`Hi, ${this.name}`);
  }
}

特点:

  • 语法更简洁
  • 本质仍是构造函数+原型
  • 方法自动添加到原型
相关推荐
To_OC7 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
灯澜忆梦8 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-9 小时前
C#中的StringBuilder相关方法
开发语言·c#
To_OC9 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn9 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
-银雾鸢尾-9 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
এ慕ོ冬℘゜10 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
随心点儿10 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
kyriewen12 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程