阶段目标

主要学习 JS 的面向对象编程思想。

对象

概念

在编程领域,任何 事 和 物都可以概括成对象。

对象概念练习

用编程思想抽象出你心仪对象的属性和方法。

对象由属性和方法组成,属性和方法都可以用 键值对 定义。

心仪对象:

属性:特征

身高:150 cm

年龄:36

性别:女

腿:大长腿

方法:功能 - 函数

生活技能:煮饭

运动技能:打篮球

艺术技能:rap

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 创建一个对象
var person = {
// 对象的属性 - 特征
height: "170cm",
age: 36,
sex: "女",
leg: "大长腿",
// 生活技能
// 对象的方法 - 功能,技能,函数
liveSkill:function(){
console.log('生活技能: 煮饭');
},
sportSkill:function(){
console.log("运动技能:打篮球");
},
artSkill:function(){
console.log('艺术技能:rap')
},
}
console.log(person);
// 编程中的对象主要是对 事 和 物进行了概括
// 编程的时候要把特征和功能书写到对应的键值对中
// 方法:就是代表某个功能,该功能是可以反复调用的
// 对象是无序的,不需要管输出顺序,只需要管书写顺序,数组是有序的
</script>
</body>
</html>

面向过程和面向对象

面向对象三大特征

面向对象三大特征:封装,继承 和 多态。

注意:JS不支持多态,我们 JS 的面向对象主要是 封装 和 继承。

面向过程编程

想到什么写什么,按照需求一步步实现,不需要把项目的元素抽离成对象。

面向对象编程

  1. 分析页面中哪些元素可以抽离成对象

  2. 分析对象的属性

  3. 分析抽象对象的方法

  4. 按照需求一步步实现

小结

面向过程书写简单,但是修改起来麻烦。

面向对象书写复杂,但是后期加功能,或者修改功能较为方便。

工厂函数

目标

利用工厂函数创建多个对象

概念

工厂函数其实就是把创建对象的过程用一个函数进行了封装。函数内部创建对象,并把对象返回。

参考代码 1

function createPerson(name, age) {
// 函数内部创建一个 person 对象
var person = {
// 对象的属性
name: name,
age: age,
// 对象的方法
sayHi: function () {
console.log(this.name + ",666");
}
}
// 把函数内部的对象返回
return person;
}
// 调用函数创建 大白 对象
var p1 = createPerson("大白", 2);
// 调用函数创建 大黑牛 对象
var p2 = createPerson("大黑牛", 18);
// 输出两个对象
console.log(p1, p2);

参考代码 2

function createPerson(name, age) {
// 创建一个空对象
var person = new Object();
// 给对象添加属性
person.name = name;
person.age = age;
// 给对象添加方法
person.sayHi = function () {
console.log("我是" + this.name + ",我很666");
}
// 函数内部返回创建的对象
return person;
}
// 调用函数创建 超人 对象
var p1 = createPerson("超人", 100);
// 再调用函数创建 蝙蝠侠 对象
var p2 = createPerson("蝙蝠侠", 30); // 输出对象
console.log(p1, p2); // 调用对象的方法
p1.sayHi();

小结

  1. 工厂函数需要在函数内部手动创建对象。

  2. 工厂函数需要设置返回值,返回创建的对象。

构造函数 *

目标

利用构造函数方式创建对象

概念

构造函数其实也是函数,用于创建对象,多次调用能创建多个不同的对象。

参考代码

function Person(name, age) {
debugger; // 断点调试,函数内部自动创建 this 对象
// var person = new Object();
this.name = name;
this.age = age;
this.sayHi = function () {
console.log("我是" + this.name + ",我很666");
}
// return person; // 不需要设置返回值,自动返回 this 对象
}
var p1 = new Person("超人", 100);
var p2 = new Person("蝙蝠侠", 30);
console.log(p1, p2);

功能:构造函数也是个函数,用于创建多个对象。

构造函数和工厂函数区别

  构造函数 * 工厂函数
函数名称 首字母大写 驼峰命名
在函数内部,是否需要创建对象 不需要 需要创建对象
在函数内部,是否需要设置返回值 不需要 需要返回创建的对象
在调用的时候,是否需要 new 关键词 需要 new 关键词 不需要,普通函数调用

构造函数创建对象更方便,推荐使用。

注意:如果构造函数忘记了些 new 关键词,JS 会把他当做普通函数执行。

普通函数内部的 this 默认指向 window 对象。

小结

构造函数相对于工厂函数来说更多人使用。推荐大家也使用构造函数创建对象。

new 的功能

目标

了解 new 主要的功能

概念

new 在构造函数内部主要有以下功能。

  1. 函数内部创建一个新对象 this

  2. 函数最后把对象返回 return this

所以调用 构造函数 的时候一定要记得 new 关键词。

 // 创建构造函数
function Person(name, age) {
// var person = new Object();
this.name = name;
this.age = age;
this.sayHi = function () {
console.log("我是" + this.name + ",我很666");
}
// return person;
}
var p1 = new Person("超人", 100);
var p2 = new Person("蝙蝠侠", 30);
console.log(p1, p2);

原型关系图

目标

梳理构造函数,实例对象,原型对象的关系

参考关系图

注意三个关键术语

  1. 构造函数 - 用于创建对象的函数

  2. 实例对象 - 调用构造函数创建出来的对象

  3. 原型对象 - 构造函数和实例对象都有原型

    注意:原型方法是《共享》的,书写的时候写到《构造函数》上,给《实例对象》使用。

小结

构造函数相当于妈妈,(妈妈主要是用于添加属性的)

原型对象相当于爸爸,(JS自动给妈妈分配了个老公,主要用于添加方法的)

实例对象相当于孩子,(通过妈妈创建孩子,孩子有妈妈的属性,有爸爸的方法)

面向对象编程步骤:

  1. 分析项目中有什么对象,抽离成对象。

  2. 分析对象的属性 - 属性写到构造函数的内部

  3. 分析对象的方法 - 方法写到构造函数的原型

  4. 用 new 关键词调用构造函数,创建实例对象。

  5. 封装的功能写到方法上,实例对象调用方法激活功能。

案例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#map {
margin: 0 auto;
width: 800px;
height: 400px;
background-color: #333;
position: relative;
} </style>
</head>
<body>
<div id="map"></div>
<script>
// 创建构造函数
function Food(width,height,top,left,backgroundColor){
// 创建属性
this.width = width;
this.height = height;
this.top = top;
this.left = left;
this.backgroundColor = backgroundColor;
this.element = null;
} // 在构造函数内创建原型对象以便给实例对象共享
// 封装生成食物标签的函数
Food.prototype.render = function(){
// 创建食物标签
var map = document.querySelector('#map');
var foodTag = document.createElement('div');
map.appendChild(foodTag);
this.element = foodTag;
// 给食物标签初始化样式
this.element.style.width = this.width + "px";
this.element.style.height = this.height + "px";
this.element.style.top = this.top + "px";
this.element.style.left = this.left + "px";
this.element.style.backgroundColor = this.backgroundColor;
this.element.style.position = "absolute";
} // 抽离生成随机数的方法
function getRandomNum(num){
return Math.floor(Math.random() * (num + 1));
} // 封装获取随机位置的方法
Food.prototype.getRanPos = function(){
this.left = getRandomNum(780/20) * 20;
this.top = getRandomNum(380/20) * 20;
this.element.style.left = this.left + "px";
this.element.style.top = this.top + "px";
} // 封装获取颜色随机值的方法
Food.prototype.getColor = function(){
var color1 = getRandomNum(255);
var color2 = getRandomNum(255);
var color3 = getRandomNum(255);
this.backgroundColor = "rgb(" + color1 + "," + color2 + "," + color3 + ")";
this.element.style.backgroundColor = this.backgroundColor;
console.log(this.backgroundColor);
} // 封装点击更换位置以及颜色的方法
Food.prototype.bindHandle = function(){
// 如果看不懂,自己console.log查看that和this是代表什么
var that = this;
this.element.addEventListener('click', function(){
that.getRanPos();
that.getColor();
})
} // 调用函数方法创建实例对象
var food1 = new Food(20,20,0,0,'pink');
food1.render();
food1.bindHandle();
console.dir(Food);
</script>
</body>
</html>

JS高级第1天的更多相关文章

  1. JS高级前端开发群加群说明及如何晋级

    JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明:   一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...

  2. 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯

    http://www.cnblogs.com/jikey/p/4426105.html js高级前端开发加群方法(此群很难进,里面纯技术,严禁广告,水群) 完整题目做完发邮箱(jikeytang@16 ...

  3. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

  4. 读JS高级——第五章-引用类型 _记录

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

    js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...

  6. 《JS高级程序设计》笔记 —— 解析查询字符串

    今天在继续翻阅<JS高级程序设计>的时候,正好翻到location对象这一小节,其中有一部分就是讲的解析查询字符串.看到这个内容立马想到了做去哪儿秋招笔试题的时候有这么一道题. 去哪儿笔试 ...

  7. js 高级函数 之示例

    js 高级函数作用域安全构造函数 function Person(name, age)    {        this.name = name;        this.age = age;     ...

  8. 惰性函数——JS高级

    我们先来看一下js的异步提交. XHR我们在原生的时候常常用到,因为常用到,我们更多把封装到了工具库中 先看下他最常用的实现 // 旧方法 function createXHR() { var xhr ...

  9. 《Node.js 高级编程》简介与第二章笔记

    <Node.js 高级编程> 作者简介 Pedro Teixerra 高产,开源项目程序员 Node 社区活跃成员,Node公司的创始人之一. 10岁开始编程,Visual Basic.C ...

  10. js高级-面向对象继承

    一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...

随机推荐

  1. C# Action 和Func

    https://www.cnblogs.com/LipeiNet/p/4694225.html

  2. 公共钥匙盒 ccf

    试题编号: 201709-2 试题名称: 公共钥匙盒 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里, ...

  3. 解释器模式(Interpreter、Context、Expression)

    (给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子.) 解释器模式的定义是一种按照规定语法进行解析的方案,在现在项目中使用的比较少,其定义如下: Given ...

  4. 门诊叫号系统系列-1.语音叫号 .net c#

    最近收到一个需求,朋友诊室需要做到门诊叫号,流程如下:病人选择医生-刷身份证排队-医生点击病人姓名叫号. 经过团队的努力,一个简易的门诊叫号系统已经完成.现在把各个功能记录下来,方便以后查看. 1.语 ...

  5. HDU3887 Counting Offspring [2017年6月计划 树上问题03]

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. Vue2.0史上最全入坑教程(上)—— 搭建Vue脚手架(vue-cli)

    ps: 想了解更多vue相关知识请点击VUE学习目录汇总 Vue作为前端三大框架之一截至到目前在github上以收获44,873颗星,足以说明其以悄然成为主流.16年10月Vue发布了2.x版本,经过 ...

  7. oracle -视图 序列 约束

    1.视图 视图是基于一个或者多个表数据库对象,视图允许用户创建一个无数据的”伪表“,视图只是一个获取特定列好行的sql查询组成,通过视图检索数据就像从表中检索数据 一样. 视图可以提供一个附加的安全层 ...

  8. LUGOU 3959 宝藏 (noip 2017 day2 T2)

    传送门 解题思路 去年noip现在拿来写..思路还是听清楚的,记忆化搜索,f[S]表示现在选了集合S时的最小代价,dis[i]表示达到最优时i这个点的深度.f[S| (1< < i-1) ...

  9. 发布Qt Widgets桌面应用程序的方法

    Qt是一款优秀的跨平台开发框架,它可以在桌面.移动平台以及嵌入式平台上运行.目前Qt 5介绍程序发布的文章帖子比较少.大家又非常想要知道如何发布Qt应用程序,于是我花了一点儿时间介绍一下如何发布Qt桌 ...

  10. 微信小程序之上拉加载更多

    loadmore 加载更多(分页加载) 当用户打开一个页面时,假设后台数据量庞大时,一次性地返回所有数据给客户端,页面的打开速度就会有所下降,而且用户只看上面的内容而不需要看后面的内容时,也浪费用户流 ...