阶段目标

主要学习 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. IO流8 --- 使用FileReader和FileWriter实现文本文件的复制 --- 技术搬运工(尚硅谷)

    @Test public void test4(){ FileReader fr = null; FileWriter fw = null; try { fr = new FileReader(&qu ...

  2. oracle习题练习-表空间-用户-表-约束

    题一 1.       创建名字为hy_tablespace的表空间,默认大小为10M;@@ 2.       创建一个用户,用户名以自己名字命名,并指定命名空间为hy_tablespace;@@@@ ...

  3. 优化SQL之最快等价SQL

    SQL优化工具Tosska SQL Tuning Expert for Oracle,帮助SQL开发人员解决SQL性能问题. 本工具主要创始人Richard To, 资深ITPUB元老,从1996年开 ...

  4. 洛谷P1832 A+B Problem(再升级) [2017年4月计划 动态规划03]

    P1832 A+B Problem(再升级) 题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛 ...

  5. Leetcode34.Find First and Last Position of Element in Sorted Array在排序数组中查找元素的位置

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  6. spring中 使用说明

    在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类 ...

  7. Leetcode687.Longest Univalue Path最长同值路径

    给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: 5 / \ 4 5 / ...

  8. 第一份Markdown。。。。。菜鸟给跪了

    #First Markdown ##Hello World ###Ahaha - Python - Ruby - C++ - Haskell - C - Java 1. C 2. C++ 3. C# ...

  9. request.getcontextPath() 详解 和 <link标签>

    classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找. 绝对路径: D:\磊弟资料\最代码\智父子考试 ...

  10. Java Map 排序

    1. 按照key值排序 对于java中Map的排序,有排序Map,比如TreeMap,对于这个Map,首先只能按照键排序,其次再put和remove的时候由于需要排序,性能上会有所牺牲. 这种方案,使 ...