javascript学习--(四)面向对象:
- 一、生成器generator:
- javascript里的generator函数是用function*定义的,
- 案例:yield 也会返回
- function* foo(x){
- yield x+1;
- yield x+2;
- yield x+3;
- return x+4;
- };
- 斐波那契函数
- 不用生成器来写的函数:
- function fib(max){
- var t,
- a=0,
- b=1,
- arr=[0,1];
- while (arr.length<max){
- [a,b]=[b,a+b]
- arr.push(b);
- }
- return arr;
- }
- fib(5); // [0, 1, 1, 2, 3]
- fib(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
- 用生成器函数
- function*fib(max){
- var t,
- a=0,
- b=1,
- n=0;
- while (n<max){
- yield a;
- [a,b]=[b,a+b];
- n++;
- }
- return;
- }
- 调用generator对象有两个方法,
- 一是不断地调用generator对象的next()方法:
- ext()方法会执行generator的代码,然后,每次遇到yield x;
- 就返回一个对象{value: x, done: true/false},然后“暂停”。
- 返回的value就是yield的返回值,done表示这个generator是否已经执行结束了。如果done为true,
- 则value就是return的返回值。
- 当执行到done为true时,这个generator对象就已经全部执行完毕,不要再继续调用next()了。
- var f = fib(5);
- f.next(); // {value: 0, done: false}
- f.next(); // {value: 1, done: false}
- f.next(); // {value: 1, done: false}
- f.next(); // {value: 2, done: false}
- f.next(); // {value: 3, done: false}
- f.next(); // {value: undefined, done: true}
- 因为generator可以在执行过程中多次返回,
- 所以它看上去就像一个可以记住执行状态的函数
- 第二个方法是直接用for ... of循环迭代generator对象,
- 这种方式不需要我们自己判断done:
- for (var x of fib1(10)) {
- console.log(x); // 依次输出0, 1, 1, 2, 3, ...
- }
- 标准对象:Date、RegExp、JSON
- 在JavaScript的世界里,一切都是对象。
- 但是某些对象还是和其他对象不太一样。为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是返回一个字符串:
- typeof 123; // 'number'
- typeof NaN; // 'number'
- typeof 'str'; // 'string'
- typeof true; // 'boolean'
- typeof undefined; // 'undefined'
- typeof Math.abs; // 'function'
- typeof null; // 'object'
- typeof []; // 'object'
- typeof {}; // 'object'
- 可见,number、string、boolean、function和undefined有别于其他类型。特别注意null的类型是object,Array的类型也是object,如果
- 我们用typeof将无法区分出null、Array和通常意义上的object——{}。
- 包装对象用new创建;
- var n = new Number(123); // 123,生成了新的包装类型
- var b = new Boolean(true); // true,生成了新的包装类型
- var s = new String('str'); // 'str',生成了新的包装类型
- 在JavaScript中,Date对象用来表示日期和时间。
- var now = new Date();
- now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
- now.getFullYear(); // 2015, 年份
- now.getMonth(); // 5, 月份,注意月份范围是0~11,5表示六月
- now.getDate(); // 24, 表示24号
- now.getDay(); // 3, 表示星期三
- now.getHours(); // 19, 24小时制
- now.getMinutes(); // 49, 分钟
- now.getSeconds(); // 22, 秒
- now.getMilliseconds(); // 875, 毫秒数
- now.getTime(); // 1435146562875, 以number形式表示的时间戳
- JSON是JavaScript Object Notation的缩写,它是一种数据交换格式。
- 在JSON中,一共就这么几种数据类型:
- number:和JavaScript的number完全一致;
- boolean:就是JavaScript的true或false;
- string:就是JavaScript的string;
- null:就是JavaScript的null;
- array:就是JavaScript的Array表示方式——[];
- object:就是JavaScript的{ ... }表示方式。
- 序列化
- 让我们先把小明这个对象序列化成JSON格式的字符串:
- 'use strict';
- var xiaoming = {
- name: '小明',
- age: 14,
- gender: true,
- height: 1.65,
- grade: null,
- 'middle-school': '\"W3C\" Middle School',
- skills: ['JavaScript', 'Java', 'Python', 'Lisp']
- };
- var s = JSON.stringify(xiaoming, null, ' ');
- console.log(s);
- 结果:
- {
- "name": "小明",
- "age": 14,
- "gender": true,
- "height": 1.65,
- "grade": null,
- "middle-school": "\"W3C\" Middle School",
- "skills": [
- "JavaScript",
- "Java",
- "Python",
- "Lisp"
- ]
- }
- 案例:
- 'use strict'
- var url = 'https://api.openweathermap.org/data/2.5/forecast?q=Beijing,cn&appid=800f49846586c3ba6e7052cfc89af16c';
- $.getJSON(url, function (data) {
- var info = {
- city: data.city.name,
- weather: data.list[0].weather[0].main,
- time: data.list[0].dt_txt
- };
- alert(JSON.stringify(info, null, ' '));
- });
- 面向对象:
- 类:类是对象的类型模板,例如,定义Student类来表示学生,
- 类本身是一种类型,Student表示学生类型,但不表示任何具体的某个学生;
- 实例:实例是根据类创建的对象,
- 例如,根据Student类可以创建出xiaoming、xiaohong、xiaojun等多个实例,每个实例表示一个具体的学生,他们全都属于Student类型。
- JavaScript不区分类和实例的概念,
- 而是通过原型(prototype)来实现面向对象编程
- 案例:
- var Student = {
- name: 'Robot',
- height: 1.2,
- run: function () {
- console.log(this.name + ' is running...');
- }
- };
- var xiaoming = {
- name: '小明'
- };
- xiaoming.__proto__ = Student;
- 注意最后一行代码把xiaoming的原型指向了对象Student,看上去xiaoming仿佛是从Student继承下来的:
- xiaoming.name; // '小明'
- xiaoming.run(); // 小明 is running...
- xiaoming有自己的name属性,但并没有定义run()方法。不过,由于小明是从Student继承而来,
- 只要Student有run()方法,xiaoming也可以调用:
- JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。
- 如果你把xiaoming的原型指向其他对象:
- var Bird = {
- fly: function () {
- console.log(this.name + ' is flying...');
- }
- };
- xiaoming.__proto__ = Bird;
- 现在xiaoming已经无法run()了,他已经变成了一只鸟:
- xiaoming.fly(); // 小明 is flying...
- 在JavaScrip代码运行时期,你可以把xiaoming从Student变成Bird,或者变成任何对象。
- // 原型对象:
- var Student = {
- name: 'Robot',
- height: 1.2,
- run: function () {
- console.log(this.name + ' is running...');
- }
- };
- function createStudent(name) {
- // 基于Student原型创建一个新对象:
- var s = Object.create(Student);
- // 初始化新对象:
- s.name = name;
- return s;
- }
- var xiaoming = createStudent('小明');
- xiaoming.run(); // 小明 is running...
- xiaoming.__proto__ === Student; // true
javascript学习--(四)面向对象:的更多相关文章
- TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts
1,面向对象的特性一:类,继承,见上一篇博客: 2,面向对象的特性二: 泛型(generic):参数化的类型,一般用来限制集合的内容:指定只能放某个类型的元素 如下图中的尖括号中的Person,就代表 ...
- JavaScript学习笔记-面向对象的模块化编程
面向对象的模块化编程 模块是一个独立的JS文件,模块文件可以包含一个类定义.一组相关的类.一个实用函数库.一些待执行的代码 模块化的目标:支持大规模的程序开发,处理分散源代码的组装,并能让代码正确执行 ...
- JavaScript学习四
2019-06-01 09:09:23 坚持,加油!!! 函数的学习 <html> <head> <script type="text/javascript&q ...
- javascript学习笔记 - 面向对象 理解对象
ECMAScript 中有两种属性:数据属性和访问器属性 一 属性类型 1.数据属性.数据属性有4个描述其行为的特性 [[Configurable]]表示能否通过delete删除属性从而重新定义属性: ...
- 如何理解并学习javascript中的面向对象(OOP) [转]
如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript ...
- JavaScript学习总结(四)function函数部分
转自:http://segmentfault.com/a/1190000000660786 概念 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. js 支持两种函数:一类是语言内部的函数 ...
- JavaScript学习笔记(十六)——面向对象编程
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- 学习javascript数据结构(四)——树
前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- JavaScript学习记录四
title: JavaScript学习记录四 toc: true date: 2018-09-16 20:31:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
随机推荐
- 【UG二次开发】创建、查询、编辑成型特征的函数
创建成型特征函数UF_MODL_create_boss 通过设置凸台的参数建立凸台特征UF_MODL_create_rect_pad 通过设置矩形凸垫的参数建立矩形凸垫特征UF_MODL_create ...
- WPF Frame 的 DataContext 不能被 Page 继承
转载至https://blog.csdn.net/sinat_31608641/article/details/88914517 已测试解决方案可行,因为WPF相关资料稀少,防止日后404,特搬运到自 ...
- ESCMScript(1)let和const
1.let命令 基本语法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 1 var b = 2 console ...
- R语言六种数据类型
1 向量 1.1 定义向量 向量使用c来赋值,向量中不能混合不同类型的数据 x<-c(2,3,7,6,8) 数值型num y<-("one","two&qu ...
- JavaScript实现的7种排序算法
所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求 ...
- Swagger/OpenAPI By Swashbuckle在NetCore 3.1中较NetCore 2.2使用的注意事项及入门
方案选择 使用Web API时,了解其各种方法对开发人员来说可能是一项挑战. Swagger也称为OpenAPI(Open Application Programming Interface,开放应用 ...
- SpringCloud微服务(基于Eureka+Feign+Hystrix+Zuul)
一.搭建注册中心 1.1.创建一个cloud-service项目 1.2:POM文件依赖 1 <?xml version="1.0" encoding="UTF-8 ...
- 二叉搜索树(Binary Search Tree)(Java实现)
@ 目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...
- centos 8 sonarqube 设置开机自启动解决方案
编写开机自启动脚本 进入到开机自启动调用文件目录 vim /etc/systemd/system/sonarqube.service [Unit] Description=SonarQube serv ...
- Springboot:单元测试日志打印@Slf4j 注解的使用方法
当自己写日志的时候,肯定需要: private final Logger logger = LoggerFactory.getLogger(LoggerTest.class); 每次写新的类,就需要重 ...