【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 6 面向对象编程

Eloquent JavaScript即将发布新版本:服务端开发实践 JavaScript是一种广泛应用于Web开发的脚本语言,而Eloquent JavaScript则是一本广受欢迎的指导性书籍,旨在帮助初学者和有经验的开发者深入理解JavaScript语言的核心概念和技术。总的来说,最新版本的Eloquent JavaScript将为读者提供一个全面的指南,帮助他们在服务端开发中充分利用JavaScript的能力。无论是初学者还是有经验的开发者,都可以通过学习Eloquent JavaScript,获得更深入的JavaScript知识,并将其应用于实际项目中。 阅读详情

1. 对象

1.1 构造函数
new 关键字提供了一种简便的新对象创建方式。如果调用函数时在前面加上 new 修饰符,其 this 变量将指向一个新对象,该对象会自动返回(除非显式使用 return 语句返回特定值)。以这种方式创建对象的函数称为构造函数。以下是创建兔子对象的构造函数。

function Rabbit(adjective){
    this.adjective = adjective;
    this.speak = function(line){
        print("The ", this.adjective, " rabbit says '", line, "'");
    };
}

//try
var killerRabbit = new Rabbit("killer");
killerRabbit.speak("GRAAAAAAAAAAAAAAAH!");

1.2 从原型中构建
为何必须使用 new 关键字?毕竟,我们也可以这样编写:

function makeRabbit(adjective){
    return{
        adjective: adjective;
        speak:function(line);
    };
}

//try
var blackRabbit = makeRabbit("black");

但是两者并不完全相同。首先,killerRabbit 有一个 constructor 属性,指向创建该属性的 Rabbit 函数。blackRabbit 也由一个这样的属性,但它指向 Object 函数。
rabbit对象基于与 Rabbit 构造函数相关的原型。可以使用构造函数的 prototype 属性访问该原型。
注意:对象可以共享其原型的属性,但这种共享是单向的(类似于 C++ 中的继承)。原型的属性影响对象,但是改变对象却永远不会影响到原型。
规则:查询一个属性值的时候,JavaScript 首先查询该对象自身的所有属性,如果有查找到属性的名称,该属性就是要查找的值;如果没有,就继续查找该对象原型,然后是原型的原型,依次类推。如果最后么有找到,则返回 undefined 值。
下面是构造函数的一个新方法:(建议以后用这种方式定义对象)

function Rabbit(adjective){
    this.adjective = adjective;
}
Rabbit.prototype.speak = function(line){//在原型的基础上添加方法
    print("The ", this.adjective, " rabbit says '", line, " '");
}

1.3 原型污染问题
JavaScript 中对象扮演者两种角色:拥有方法的值,原型对其来说是有利的;属性集,原型对其只有阻碍作用。所有对象都有原型,并从该原型上获得一些属性,这意味着,让我们想对对象遍历了解其属性时需要判断属性是属于对象自身还是属于原型,否则则会出错,这种情况也叫 原型污染 。

如何判断属性是否属于对象自身还是属于原型呢?
针对这个问题可以有两种方法判断:
a. hasOwnProperty 方法,是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员,返回一个bool值。
b. propertyIsEnumerable 方法,一个对象是否可以进行for in穷举,我们可以通过propertyIsEnumerable属性来判断,说明如下:  propertyIsEnumerable 属性,返回 Boolean 值,指出所指定的属性是否为一个对象的一部分以及该属性是否是可列举的。
进一步,可以针对这种问题编写一个构造函数并指定原型,以便将对象视为属性集进行获取。即 Dictionary 。(具体参考JavaScript编程精解 page.80)


2.构建生态系统模拟

目的:建立一个虚拟生态圈,包括一个池塘和里面游动的生物,我们建立对象来模拟生态圈和里面的生物,并为这些对象编写一些方法让生物具有“生机”,使它们有自己的生活方式。
2.1 定义生态圈
定义生态圈为一个 plan 字符串数组:

var thePlan = 
["###############################",
 "#      #     #      o        ##",
 "#                             #",
 "#           #####             #",
 "##          #   #      ##     #",
 "###            ##       #     #",
 "#            ###        #     #",
 "#     ####                    #",
 "#     ##         o            #",
 "#  o   #            o    ###  #",
 "#      #                      #",
 "###############################"]

其中 # 字符代表生态圈的墙壁(和生态圈李的岩石),o 字符代表昆虫,空格就是空的地方。
2.2 空间里的点
3. 更逼真的模拟生态系统
4. 原型继承
继承:新对象建立在旧对象的基础上,节约了重新编写这些方法的时间,这种技术称为继承。本质上来讲,继承归根结底只是一种使程序员可以偷懒的技巧。继承是创建新类型对象——子类型(subtype),子类型基于父类型(supertype)。子类型拥有父类型所有的属性和方法(从父类型继承得到),然后修改其中的部分内容或者添加新的内容,继承最好在子类型模型可以被视为父类型对象的时候使用。
注意:javascript 中没有直接继承的函数或方法,网上搜索关键词:javascript 和继承,会看到很多不同的版本。

Eloquent JavaScript Eloquent JavaScript 英文版 立即下载

相关推荐

Eloquent_JavaScript.pdf

语言:英语 Introduction This is a book about getting computers to do what you want them to do. Computers are about as common as screwdrivers today, but they contain a lot more hidden complexity and thus are harder to operate and understand. To many, they remain alien, slightly threatening things.

推荐开源项目:《Eloquent JavaScript》第三版

推荐开源项目:《Eloquent JavaScript》第三版 1、项目介绍 《Eloquent JavaScript》是一本广受欢迎的开源编程书籍,专注于JavaScript语言的深度解析和实践应用。其第三版源代码现开放在GitHub上,不仅提供HTML版本,还有PDF格式可供选择。作者鼓励读者反馈意见,并支持非商业性的翻译工作,以推广这一宝贵的教育资源。 2、项目技术分析 该项目采用Markd...

gitblog_00053的博客 557

Android AI Agent集成实战:架构设计与自动化技能开发

AI Agent(人工智能代理)是一种能够感知环境、自主规划并执行任务以达成目标的软件实体。其核心原理在于结合大语言模型的推理能力与工具调用(Tool Calling)技术,使应用从被动响应转向主动服务。在移动开发领域,这项技术的价值在于为应用注入“智能大脑”,实现跨应用自动化与个性化交互,从而显著提升用户体验和操作效率。具体到Android平台,其应用场景广泛,例如自动填写表单、智能聊天辅助、个性化工作流优化等。本文聚焦于Android AI Agent的工程化落地,深入探讨了如何利用Accessibil

weixin_42636895的博客 664

JavaScript 编程精解(Eloquent)第四版(一)

这是一本关于指导计算机的书。如今,计算机和螺丝刀一样常见,但它们要复杂得多,让它们按照你的想法运行并不总是容易的。如果你要给计算机的任务是常见且容易理解的,比如查看你的电子邮件或充当计算器,你可以打开相应的应用程序并开始工作。但对于独特或开放式的任务,往往没有合适的应用程序。这就是编程可能发挥作用的地方。是构建一个的行为——一组精确的指令,告诉计算机该做什么。由于计算机是愚蠢的、迂腐的动物,编程在根本上是乏味和令人沮丧的。幸运的是,如果你能克服这一事实——甚至享受以愚蠢机器能够处理的方式进行思考的严谨——编

龙哥盟 1577

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 415

CameraLink接口详解:从引脚定义到信号传输

本文详细解析了CameraLink接口的物理连接与信号传输机制。从MDR26连接器的引脚定义与镜像关系入手,深入讲解了BASE与MEDIUM模式下的信号映射、LVDS差分传输原理,并强调了屏蔽层处理与端接电阻等关键硬件设计细节。文章结合实战经验,提供了常见图像传输问题的排查思路,是工业视觉领域高速图像传输的实用指南。

weixin_28318011的博客 889

《Eloquent JavaScript》笔记--对象与数组

数组 数组:用来存储连续的值。形式是方括号包围,用逗号分隔。 var listOfNumbers = [2, 3, 5, 7, 11]; console.log(listOfNumbers[1]); // → 3 console.log(listOfNumbers[1 - 1]); // → 2 取得数组中的值的方法是:数组名接方括号,里面是表达式,计算结果作为数组的索引。数组的

asd131531的专栏 770

TI DSP从COFF切换到EABI输出格式的5个关键修改点(TMS320F280025实测)

本文基于TMS320F280025实测,详细解析了TI DSP从COFF切换到EABI输出格式的5个关键修改点。核心差异在于EABI遵循ELF标准,涉及链接器优化、RAM数据共享、工具链升级、double数据类型位宽变化及链接器命令文件重构。迁移时需使用.retain指令防止关键数据被优化,利用NOINIT段保护共享RAM,并更新hex2000等工具,以确保BootLoader与应用程序稳定运行。

weixin_29189381的博客 266

Eloquent JavaScript 笔记 十一:A Programming Language

本章使用js实现Egg语言的解释器。解释器是一个复杂的概念,也许需要单独的一本书来讲解。作者通过一个短小精炼的语言Egg,用一章的篇幅就实现了解释器的基本功能,一共不超过200行代码,可谓神奇,同时也充分体现了js的神奇之处。 通过本章的学习,不仅可以复习前几章的概念,同时,对js语言本身的实现机制也会有更深层次的理解。

wershest的专栏 525

嵌入式工程师成长之路(5)——板子调试

USB2514集线器调试总结说说USB连接线USB数据线上的“疙瘩”:原来有这么大用处!

云轩阁 4万+

零基础NPU固件开发学习路线--1.4 学习路线与工具链:编译器、仿真器、调试器、烧录工具

本文系统介绍了NPU固件开发的学习路径与工具链。学习路线分为四个阶段:基础认知、环境搭建、模块开发和联调量产。重点讲解了交叉编译器、代码管理工具、调试器和烧录工具等核心工具链的使用方法。文章强调工具链在NPU固件开发中的关键作用,详细阐述了从代码同步到固件烧录的全流程开发闭环,为开发者提供了一条从零基础到独立开发的完整学习路径。

MHD0815的博客 116

【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 5 函数式编程

在知乎上有人推荐的这本书,抱着试试看的态度在图书馆借了本,只有160+页,完全不像其他编程书,但是这本书主要是从编程思想上来由浅入深写一些作者的心得体会,好多地方自己之前都没有想过,也没有实践过,总之这书写的比较叼,应该多看几遍。Chapter 5 函数式编程本章主要讲了一些函数编程抽象思想及技巧,粗略的读了一遍,学到了些皮毛,有空回来再多看几遍,相信会有更多收获。一、 throw+catch+tr

不会飞的超人先生的博客 738

R语言中的Gamma分布函数

在R语言中,我们可以使用最大似然估计(Maximum Likelihood Estimation,MLE)或最小二乘估计(Least Squares Estimation,LSE)等方法来估计Gamma分布的参数。本文介绍了在R语言中使用Gamma分布函数的基本操作,包括生成随机变量、计算概率密度函数和累积分布函数,以及参数估计和拟合。函数来生成Gamma分布的随机变量,计算概率密度函数(PDF)和累积分布函数(CDF),以及进行参数估计和拟合。要计算Gamma分布的累积分布函数(CDF),我们可以使用。

ByteWhiz的博客 1633

【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 2 函数

函数定义顺序 计算机在开始执行语句之前,会先查找所有的 function 定义,然后保存相关的 function,我们不必去思考多个函数定义的顺序,使用函数是允许它们之间相互调用,而不用考虑那个函数在第一个位置定义。 词法作用域 函数内部的变量集是否可见,取决于函数在程序中的位置,在函数“上面”定义的所有变量都是可见的,也就是存在于函数体内并包含函数定义的以及位于程序顶级的变量。javascri

不会飞的超人先生的博客 617

【WiFi】T830 MT7992 WMM测试修改操作说明

WiFi WMM(Wi-Fi Multimedia)是Wi-Fi联盟推出的一项技术,用于优化无线网络中的多媒体内容传输。WMM通过优先处理不同类型的数据流来改善网络性能,特别是在网络拥堵时。:WMM通过提供服务质量支持,确保语音、视频和其他多媒体应用在无线网络中获得优先处理。这有助于减少延迟和抖动,改善用户体验。:WMM将数据流分为四个优先级队列:语音、视频、最佳效果(Best Effort)和背景(Background)。语音和视频流通常被赋予更高的优先级,以确保它们在网络中得到及时传输。

wgl307293845的博客 1022

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 11 浏览器事件

浏览器事件

不会飞的超人先生的博客 505

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 4 错误处理

一、 问题类型编写程序是,遇到问题情境大致可以分成:程序员错误和运行时错误。如果程序员忘记给函数传入一个必须的参数,就是程序员错误;如果程序要求用户输入名字但返回的确实空字符串,这就是程序员无法控制的错误,即运行时错误。二、 处理错误异常处理:当函数由于某种原因不能正常返回时,要立即停止现在的操作,然后跳转到能够处理问题的位置。这就是异常处理。 异常处理工作原理:代码可以引发(抛出)异常,该异常是

不会飞的超人先生的博客 803

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Eloquent JavaScript 笔记 十九:Node.js

几年前就听说过node.js,但没有仔细了解过,一直以为它是专门用来编写web server的。读了这一章才知道,node.js 多么神奇,有了它,js就可以做任何事了。

wershest的专栏 736

《Eloquent JavaScript》笔记--程序的结构;

表达式和语句 一段能产生值的代码叫表达式。任何以字面形式写出来的代码(如“John”,233,)都是表达式。表达式可被括号括起来,仍然是表达式,比如使用二元或者一元操作符的表达式就是这样的。 表达式就像句子中的短语,语句就像是完整的句子,程序就是一系列的语句。 最简单的语句是一个表达式接一个分号: 1; !false: 表达式可以产生一个值,然后被包裹他的表达式所使用。只有当语句能

gnsydss的专栏 580

JavaScript 编程精解(Eloquent)第四版(四)

Node是一个精巧的小系统,使我们能够在非浏览器环境中运行JavaScript。它最初设计用于网络任务,充当网络中的一个节点,但它适用于各种脚本任务。如果编写JavaScript是你喜欢的事情,使用Node自动化任务可能会对你很有帮助。NPM提供了你能想到的所有包(还有一些你可能从未想到的包),并允许你使用npm程序获取和安装这些包。Node内置了一些模块,包括用于处理文件系统的node:fs模块和用于运行HTTP服务器的node:http模块。在Node。

龙哥盟 1645

Eloquent JavaScript 笔记 四:Objects and Arrays

本章用一个实际的案例 —— 松鼠人,深入讲解了Object的使用方法(应该叫实用方法)。这是一个相当复杂的实例,引入了众多的概念:Array、Object、Map、Correlation等等。 Object 是JavaScript中一切数据结构的基础,不仔细的深入了解这个概念,会觉得js中很多现象匪夷所思。

wershest的专栏 647

JavaScript 编程精解(Eloquent)第四版(五)

然后可以遍历所有时间戳(遍历日志文件及每个日志文件中的数字),对于每一个,如果它发生在正确的日期,就取出发生的小时,并将对应的数字加一。如果在循环中,你改变放置当前点的圆的半径,并且转圈超过一次,结果就是一个螺旋。然后在起始位置周围的像素正方形上循环,其边长至少为半径的两倍,并对在圆的半径内的像素上色,再次使用勾股公式来计算它们与中心的距离。要进行重试,你可以使用一个仅在调用成功时停止的循环—如本章早些时候的示例,或者使用递归并希望不会出现过长的失败字符串,以至于溢出栈(这通常是相当安全的假设)。

龙哥盟 1527

JSNinja-《Eloquent Javascript》读书笔记

朋友推荐的一本书(http://eloquentjavascript.net/),趁最近不忙看了下。 总的来说这本书一般吧,不大适合JS入门读者,因为里面的例子比较败笔,比较学术性不够生动和切符实际工作应用。 对于JS的书,个人还是推荐《head first javascript》~事实上据说head first那系列的书都还不错。 每本书总有其可取之处的,如果你计划也看这本书,或许你直接过...

weixin_30724853的博客 158

《Eloquent JavaScript》笔记--错误处理

严格模式 在文件第一行,或函数体(该函数有效)当中加入 "use strict";,可以让javascript运行在“严格模式”中。 function canYouSpotTheProblem() { "use strict"; //此函数有效 for (counter = 0; counter < 10; counter++) console.log("Happy h

380

JavaScript 编程精解(Eloquent)第四版·翻译完成

JavaScript 编程精解(Eloquent)第四版第一章:引言第一部分:语言第二章:值、类型和运算符第三章:程序结构第四章:函数第五章:数据结构:对象和数组第六章:高阶函数第七章:对象的秘密生活第八章:项目:一个机器人第九章:漏洞和错误第十章:正则表达式第十一章:模块第十二章:异步编程第十三章:项目:一种编程语言第二部分:浏览器第十四章:JAVASCRIPT 与浏览器第十五章:文档对象模型第十六章:处理事件第十七章:项目:一个平台游戏第十八章:在画布上绘图第十九章:HTTP 与表单第二十章:项目:一个

龙哥盟 738

《Eloquent JavaScript》笔记--函数;

函数可以用来结构化大段程序;减少重复;为子程序命名,将子程序彼此分开。 编程语言有越多预先精确定义的函数,灵活性就越低,所以需要程序员自己编写函数而不是语言作者内置越多的函数就越好。 定义函数 关键字function,可选的参数,必不可少的花括号。有些函数可以返回值,有些则没有,他们只产生side effect。 return 关键字会立刻跳出函数,将表达式返回给函数调用的代码,如果ret

formyth的专栏 582
上一篇: 【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 4 错误处理
下一篇: 【JS/网易公开课】哈佛大学公开课:构建动态网站 第6讲 JavaScript
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值