《Head First HTML5 javascript》第10章 自定义对象

news2024/10/7 16:17:32

2022.11.23 第10章 自定义对象

面向对象OOP(Object Oriented Programming)

对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)对象是存储在单个分组中的相关功能的集合。在 JavaScript 中,大多数事物都是对象,从作为核心功能的字符串和数组,到建立在 JavaScript 之上的浏览器 API。

继承与原型链

对于使用过基于类的语言 (如 Java 或 C++) 的开发者们来说,JavaScript 实在是有些令人困惑 —— JavaScript 是动态的,本身不提供一个 class的实现。即便是在 ES2015/ES6 中引入了 class关键字,但那也只是语法糖,JavaScript 仍然是基于原型的。

当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object)都有一个私有属性(称之为 proto)指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(proto),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

几乎所有 JavaScript 中的对象都是位于原型链顶端的 Object  的实例。

尽管这种原型继承通常被认为是 JavaScript 的弱点之一,但是原型继承模型本身实际上比经典模型更强大。例如,在原型模型的基础上构建经典模型相当简单。

在 JavaScript 中,函数(function)是允许拥有属性的。所有的函数会有一个特别的属性 —— prototype

 

  1. 创建类特性(class property),使用prototype对象

    1. 存储一次,能被所有实例访问,不必定要初始化

      Blog.prototype.signature = "by Puzzler Ruby";
      
    2. 在实例内访问类特性用关键字this,跟访问实例特性一样

      Blog.prototype.toHTML = function(highlight) {
      				...
      					blogHTML +=  this.signature + "</em></p>";
      			...
      			};
      
  2. 类拥有的实例方法(class-owned instance method),使用prototype对象

    1. 存储一次运行多次,方法只有一份,由所有实例共享
    2. 虽然属于类,但能够访问实例特性
  3. 类方法(class method),不使用prototype对象

    1. 为类所有,不能访问实例特性或方法,但可以被实例调用(透过类名即可)

      Blog.blogSorter = function(blog1, blog2) {
      				return blog2.date - blog1.date;
      			};
      
    2. 只能访问类特性,需要下探至prototype特性内

      function showBlog(num)
      			{
      				blog.sort(Blog.blogSorter);		
      				...
      			}
      

对象实例instance

在 JavaScript 中,构造器其实就是一个普通的函数。当使用 new 操作符  来作用这个函数时,它就可以被称为构造方法(构造函数)。

function Graph() {
  this.vertices = [];
  this.edges = [];
}

Graph.prototype = {
  addVertex: function(v){
    this.vertices.push(v);
  }
};

var g = new Graph();
// g 是生成的对象,他的自身属性有 'vertices' 和 'edges'。
// 在 g 被实例化时,g.[[Prototype]] 指向了 Graph.prototype。

其他知识点

  1. <table>元素表示表格数据——即通过二维数据表表示的信息

    内容分类流动内容
    允许的内容按照这个顺序:
    • 一个可选的 <caption>  元素 表格的标题
    • 零个或多个的 <colgroup>  元素 定义表中的一组列表
    • 一个可选的 <thead>  元素 通过二维数据表表示的信息
    • 下列任意一个:
     ◦ 零个或多个 <tbody>  封装了一系列表格的(<tr>)
     ◦ 零个或多个 <tr> 定义表格中的行
    

    • 一个可选的 <tfoot>  元素 定义了一组表格中各列的汇总行 | | 标签省略 | 不允许,开始标签和结束标签都不能省略。 | | 允许的父元素 | 任何支持流内容 (en-US)的元素 | | 允许的 ARIA 角色 | Any | | DOM 接口 | HTMLTableElement |

    <table>
      <caption>Color names and values</caption>
      <tbody>
        <tr>
          <th scope="col">Name</th>
          <th scope="col">HEX</th>
          <th scope="col">HSLa</th>
          <th scope="col">RGBa</th>
        </tr>
        <tr>
          <th scope="row">Teal</th>
          <td><code>#51F6F6</code></td>
          <td><code>hsla(180, 90%, 64%, 1)</code></td>
          <td><code>rgba(81, 246, 246, 1)</code></td>
        </tr>
        <tr>
          <th scope="row">Goldenrod</th>
          <td><code>#F6BC57</code></td>
          <td><code>hsla(38, 90%, 65%, 1)</code></td>
          <td><code>rgba(246, 188, 87, 1)</code></td>
        </tr>
      </tbody>
    </table>
    
  2. <td>定义了一个包含数据的表格单元格。It participates in the table model.

  3. vertical-align 指定行内元素(inline)或表格单元格(table-cell)元素的垂直对齐方式。

    /* Keyword values */
    vertical-align: baseline;
    vertical-align: sub;
    vertical-align: super;
    vertical-align: text-top;
    vertical-align: text-bottom;
    vertical-align: middle;
    vertical-align: top;
    vertical-align: bottom;
    
    /* <length> values */
    vertical-align: 10em;
    vertical-align: 4px;
    
    /* <percentage> values */
    vertical-align: 20%;
    
    /* Global values */
    vertical-align: inherit;
    vertical-align: initial;
    vertical-align: unset;
    
  4. <style >元素包含文档的样式信息或者文档的部分内容。默认情况下,该标签的样式信息通常是CSS的格式。

  5. **JavaScript 控制台**是一个非常有用的工具,用于调试没有按预期运行的 JavaScript。它允许您针对浏览器当前加载的页面运行 JavaScript 行,并报告浏览器尝试执行代码时遇到的错误。要在任何浏览器中访问控制台,只需按控制台按钮。 (在 Internet Explorer 中,按 Ctrl + 2.)这将给你一个如下所示的窗口

案例:使用自定义对象实现blog目录

<html>
	<head>
		<title>YouCube - The Blog for Cube Puzzlers</title>
		<script>

			function Blog(body, date, image){
				this.body = body;
				this.date = date;
				this.image = image;
			}

			Blog.prototype.toString = function(){
					return "[" + this.date.shortFormat() + "]" + this.body;
				};

			Blog.prototype.toHTML = function(highlight){
				var blogHTML = "";
				blogHTML += highlight ? "<p style='background-color:#eeeeee'>" : "<p>";

				if (this.image){
					
					blogHTML += "<strong>" + this.date.shortFormat() + "</strong><br /><table><tr><td>" + "<img src='" + this.image +"'/> </td><td style='vertical-align:top'>" + "</br>" + this.body + "</td></tr></table><br /><em>" + this.signature + "</em></p>" ;

				}
				else
					blogHTML += "<strong>" + this.date.shortFormat() + "</strong>" + "</br>" + this.body + "<br /><em>" + this.signature + "</em></p>" ;
				return blogHTML;
			};

			Blog.prototype.containsText = function(text){
				return(this.body.toLowerCase().indexOf(text.toLowerCase()) != -1);
			};

			Blog.prototype.signature = "pizzler ruby";

			Date.prototype.shortFormat = function(){
				return this.getFullYear()  + "/" + (this.getMonth() + 1) + "/" + this.getDate();
			};

			Blog.blogSorter = function(blog1, blog2){
				return blog2.date-blog1.date;
			};

			var blog = [new Blog("Got the new cube I ordered. It's a real pearl.", new Date("08/14/2008")),
						new Blog("second line.", new Date("08/19/2008")),
						new Blog("third line.", new Date("08/16/2008")),
						new Blog("the fourth line.", new Date("08/21/2008"), "cube77.png"),
						new Blog("Got the new cube I ordered. It's a real pearl.", new Date("08/14/2008")),
						new Blog("second line.", new Date("08/19/2008")),
						new Blog("third line.", new Date("08/16/2008")),
						new Blog("the fourth line.", new Date("08/21/2008"))];

			function showBlog(numEn){
				//如果没有传入显示个数,则显示所有日志
				if (!numEn)
					numEn = blog.length;

				//显示日志
				var blogText = "";
				for (var i=0; i<numEn; i++){
					blogText += blog[i].toHTML(0 == i%2);
				}
				document.getElementById("blog").innerHTML = blogText;
			}

			//倒序排列
			blog.sort(Blog.blogSorter);

			function searchBlog(){
				var searchText = document.getElementById("searchtext").value;
				for (var i = 0; i<blog.length; i++){
					if (blog[i].containsText(searchText)){
						alert(blog[i]);
						break;
					}
				}
				if (blog.length == i)
				alert("sorry,there are no blog entries containing the search text.");
			}
			
			function randomBlog(){
				var i = Math.floor(Math.random() * blog.length);
				alert(blog[i]);
			}

		</script>
	
	</head>

	<body onload = "showBlog(5);">
		<h3>YouCube - The Blog for Cube Puzzlers</h3>
		<img src="cube.png" alt="YouCube" />
		<input type="button" id="search" value="search the blog" onclick="searchBlog();" />
		<input type="text" id="searchtext"  value="" />

		<div id="blog"></div>
		<input type="button" id="showall" value="show all blog" onclick="showBlog();" />
		<input type="button" id="random" value="random the blog" onclick="randomBlog();" />
		
	</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券|多只公募基金损失惨重;储能板块低开高走

今天早盘&#xff0c;A股大幅低开&#xff0c;上证50指数直接跳空跌破2500点&#xff0c;最多跌逾3%&#xff0c;创业板指亦跌破2300点整数关口。 盘面上&#xff0c;酒店餐饮、旅游、储能、ST等板块逆势活跃&#xff0c;酿酒、工程机械、互联网、证券等板块跌幅居前。北上资金…

【LeetCode每日一题:1758. 生成交替二进制字符串的最少操作数~~~模拟+遍历+计数】

题目描述 给你一个仅由字符 ‘0’ 和 ‘1’ 组成的字符串 s 。一步操作中&#xff0c;你可以将任一 ‘0’ 变成 ‘1’ &#xff0c;或者将 ‘1’ 变成 ‘0’ 。 交替字符串 定义为&#xff1a;如果字符串中不存在相邻两个字符相等的情况&#xff0c;那么该字符串就是交替字符…

KVM虚拟机热扩容

创建一个虚拟机用于练习在线扩容 virt-install --name centos8-3 --memory 4096,currentMemory1024 --vcpus 2,maxvcpus8 --disk /var/lib/libvirt/images/centos8-3.qcow2,busvirtio,formatqcow2 --import --os-variant rhel8.0 --graphics vnc --network networkdefault…

Docker-JenKins安装及配置!

Jenkins官网&#xff1a;Jenkins 安装主机配置&#xff08;官方&#xff09;&#xff1a; 最低&#xff1a; 256 MB 内存 1 GB 的驱动器空间&#xff08;尽管如果将 Jenkins 作为 Docker 容器运行&#xff0c;则建议至少 10 GB&#xff09; 小团队推荐&#xff1a; 4 GB …

针对支付宝-当面付实现的个人支付

测试地址 项目背景 为什么想做这个 一是工作中也接触到了支付宝&#xff0c;微信支付方面&#xff0c;二是自己也想弄个收费服务&#xff0c;比如之后做的程序想收费可以直接让用户扫码支付&#xff0c;而不用微信交流了。 了解什么支付适合个人支付 微信支付&#xff1a;需要…

基于SpringBoot的实习管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

Unity与IOS⭐Xcode打包,上架TestFlight的完整教程

文章目录 🟥 本章注意事项1️⃣ 证书及Archive2️⃣ 更新版本及加密规则🟧 Xcode打包出ipa文件🟨 将ipa上传到App Store Connect🟥 本章注意事项 1️⃣ 证书及Archive 上架TestFlight需要苹果企业版证书,而不是个人版证书。Archive时必须插上手机,否则会失败。2️⃣…

Prometheus 采集rabbitmq监控数据

Prometheus采集主机监控参考部署下载&#xff0c;图形生成 系统安装Grafana downloadWindows参考图形生成参考win_exporterLinux参考node_exporterMysql参考Mysql_exporterSQL Server参考SQL exporterRedis 参考Redis_exportercadvisor参考cadvisorrabbitmq参考参考rabbitmq s…

众多互联网公司都在用的Elasticsearch还不会?熬夜整理基于 Elasticsearch 7.x 版本的核心知识学习手册,值得拥有!

简介 简单来说 ElasticSearch 就是一个搜索框架。对于搜索这个词我们并不陌生&#xff0c;当我们输入关键词后&#xff0c;返回含有该关键词的所有信息结果。 在我们平时用到最多的便是数据库搜索&#xff1a; SELECT * FROM USE WHERE NAME LIKE %小菜%但是用数据库做搜索存…

Scala函数至简原则

一、Scala中的函数基础知识 1、基本语法 【函数和方法的区别】 【核心概念】 &#xff08;1&#xff09;为完成某一功能的程序语句的集合&#xff0c;称为函数。 &#xff08;2&#xff09;类中的函数称之方法。 【案例实操】 &#xff08;1&#xff09;Scala 语言可以在任何…

THP Maleimide,1314929-99-1,THP-Mal凯新生物双功能螯合剂

一、产品描述&#xff1a; THP-Mal 双功能螯合剂。肽和抗体标记。对SH基团的特异性反应&#xff0c;如半胱氨酸。炔烃马来酰亚胺是一种双功能接头试剂&#xff0c;可将末端炔烃连接到各种含硫醇分子&#xff0c;例如含有半胱氨酸残基的蛋白质&#xff0c;然后可以通过铜催化的…

2022腾讯全球数字生态大会【存储专场】它来了|预约有礼

它来了&#xff01;它来了&#xff01; 2022腾讯全球数字生态大会【存储专场】它来了&#xff01; 作为腾讯集团产业互联网规格最高、规模最大、覆盖面最广的年度盛会 今年存储专场与您一起探讨 分布式高性能存储与数据分析处理的科技创新和最新成果 存储会场六大亮点&…

java 基于 SpringMVC+Mybaties+ Html5 + Vue 前后端分离 房地产管理系统 的 设计与实现

一.项目介绍 本系统分为 两大块 前端 和 后端 &#xff08;前后端分离&#xff09; 角色分为三类&#xff1a; 管理员 销售 以及 普通用户 前端模块有&#xff1a;首页、房屋中心、关于大厦、新闻资讯、个人中心、后台管理、客服售后 其中个人中心&#xff1a;个人中心、我的收…

1.线性代数基础

1.矩阵 2. 特殊矩阵 正交矩阵 AATE&#xff08;E为单位矩阵&#xff0c;AT表示“矩阵A的转置矩阵”。&#xff09;或ATAE&#xff0c;则n阶实矩阵A称为正交矩阵 正交矩阵有如下性质&#xff1a; A是正交矩阵&#xff0c;AT也是正交矩阵A的各行是单位向量且两两正交&#xff0…

Google Earth Engine(GEE)——NASA NEX GDPDDP CMIP5数据集中的问题

问题&#xff1a; 我正在使用 NASA NEX GDPDDP CMIP5 集合。我注意到模型“GFDL-CM3”似乎缺少场景 RCP4.5 的 2096-2099 年。 您可以通过此脚本查看丢失的图像&#xff0c;并与模型 ACCESS1-0 进行比较&#xff1a; https://code.earthengine.google.com/7b505c81a59f10ba5…

[附源码]Python计算机毕业设计Django的高校车辆租赁管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

学习笔记11月27日

Infant Brain Deformable Registration Using Global and Local Label-Driven Deep Regression Learning 文章来源&#xff1a;谷歌学术 一、摘要 婴儿大脑磁共振&#xff08;MR&#xff09;图像的可变形配准具有挑战性&#xff0c;因为&#xff1a;(1)这些纵向图像存在较大的…

【MySQL】读写分离主从复制

1. 原理篇 1.1 读写分离问题场景&#xff1a; 高并发场景&#xff0c;读数据操作远高于写数据操作 —— 为了实现读写分离&#xff0c;我们使用数据库的主从复制&#xff1a; 1.2 主从复制&#xff1a; 实现主从复制的流程如下&#xff1a; MySQL 的主从复制实现机制如下&am…

shell基本命令

shell基本命令 echo&#xff1a; -n&#xff1a;取消输出后行末的换行符号 -e&#xff1a;支持反斜线控制的字符转换 echo -e "\a":输出警告声 echo -e "\e[1;31m abcd \e[0m"&#xff1a;输出带颜色的信息bash执行方法&#xff1a; 给bash文件添加执行…

《龙湖地产》企业门户网站前端设计(Html,CSS,JavaScript,jQuery)

目 录 引言 1 一、企业网站建设方案 2 &#xff08;一&#xff09;搭建网站的必要性和可行性 2 &#xff08;二&#xff09;网站建设的目的 2 &#xff08;三&#xff09;网站设计原则 2 二、企业网站开发工具的选择和介绍 4 &#xff08;一&#xff09; HTML概述 4 &#xff0…