当前位置:首页 > 技术 > 正文内容

JavaScript高级程序设计(第四版)对象与类的深入解析

访客 技术 2026年9月29日 8

对象创建方法

工厂模式通过封装对象生成逻辑实现复用,但无法识别对象类型。

function generateUser(username, userAge, jobTitle) { 
  const obj = new Object(); 
  obj.name = username; 
  obj.age = userAge; 
  obj.position = jobTitle; 
  obj.greet = function() { 
    console.log(this.name); 
  }; 
  return obj; 
} 
const userA = generateUser("John", 30, "Developer"); 
const userB = generateUser("Alice", 25, "Designer");

构造函数模式通过特定命名规范区分普通函数,实现类型化对象创建。

function User(username, userAge, jobTitle){ 
  this.name = username; 
  this.age = userAge; 
  this.position = jobTitle; 
  this.greet = function() { 
    console.log(this.name); 
  }; 
} 
const userC = new User("Michael", 35, "Manager"); 
userC.greet();

原型模式通过共享原型对象实现属性方法复用。

function Employee() {} 
Employee.prototype.employeeName = "Sarah"; 
Employee.prototype.age = 28; 
Employee.prototype.position = "Engineer"; 
Employee.prototype.greet = function() { 
  console.log(this.employeeName); 
}; 
const emp1 = new Employee(); 
emp1.greet(); 
const emp2 = new Employee(); 
console.log(emp1.greet === emp2.greet);

继承实现方式

原型链继承通过修改原型链实现属性方法传递。

function ParentType() { 
  this.hasProperty = true; 
} 
ParentType.prototype.getParentValue = function() { 
  return this.hasProperty; 
}; 
function ChildType() { 
  this.hasSubProperty = false; 
} 
// 继承逻辑 
ChildType.prototype = new ParentType(); 
ChildType.prototype.getSubValue = function () {
  return this.hasSubProperty; 
}; 
const instance = new ChildType(); 
console.log(instance.getParentValue());

原型链继承存在引用类型共享问题,导致实例间数据污染。

function Parent() { 
  this.colors = ["red", "blue", "green"]; 
} 
function Child() {} 
Child.prototype = new Parent(); 
const inst1 = new Child(); 
inst1.colors.push("black"); 
console.log(inst1.colors); 
const inst2 = new Child(); 
console.log(inst2.colors);

继承优化方案

构造函数盗用通过调用父类构造函数实现参数传递。

function Parent(name){ 
  this.userName = name; 
} 
function Child() { 
  // 调用父类构造函数 
  Parent.call(this, "Emily"); 
  this.userAge = 22; 
} 
const instance = new Child(); 
console.log(instance.userName); 
console.log(instance.userAge);

组合继承结合原型链和构造函数优势,实现属性方法分离。

function Parent(name){ 
  this.userName = name; 
  this.colors = ["red", "blue", "green"]; 
} 
Parent.prototype.showName = function() { 
  console.log(this.userName); 
}; 
function Child(name, age){ 
  // 继承属性 
  Parent.call(this, name); 
  this.userAge = age; 
} 
// 继承方法 
Child.prototype = new Parent(); 
Child.prototype.showAge = function() { 
  console.log(this.userAge); 
}; 
const inst1 = new Child("David", 28); 
inst1.colors.push("black"); 
console.log(inst1.colors); 
inst1.showName(); 
inst1.showAge();

原型式继承通过对象克隆实现属性共享。

const base = { 
  name: "Tom", 
  friends: ["Jerry", "Spike"] 
}; 
const clone1 = Object.create(base); 
clone1.name = "Jerry"; 
clone1.friends.push("Tyke"); 
const clone2 = Object.create(base); 
console.log(base.friends);

寄生式组合继承通过优化原型链减少冗余调用。

function Parent(name) { 
  this.userName = name; 
  this.colors = ["red", "blue", "green"]; 
} 
Parent.prototype.showName = function() { 
  console.log(this.userName); 
}; 
function Child(name, age){ 
  Parent.call(this, name); 
  this.userAge = age; 
} 
// 优化原型链 
Child.prototype = new Parent(); 
Child.prototype.constructor = Child; 
Child.prototype.showAge = function() { 
  console.log(this.userAge); 
};

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。