闭包的私有变量

function Ninja() {
let feints = 0;
this.getFeints = function () {
return feints
};
this.feint = function () {
feints++;
return feints
}
} let ninja1 = new Ninja(); 每一个通过ninja1 构造函数创建的对象实例可以获得各自的实例方法,但是私有变量不允许直接访问,为什么要保持私有变量的引用?,因为这些私有变量并不是对象的私有属性,但是通过构造函数所创建的对象方法去访问这些变量
* 通过函数访问私有变量,而不是通过对象访问

生成器

function* weaponGenerator() {
yield 1;
yield 2;
yield 3;
} let a = weaponGenerator();
//for (const arrayElement of a) {
// console.log(arrayElement);
//}
console.log(a.next());
// { value: 1, done: false }
while (!a.next().done) {
console.log(a.next().value);
} 使用yield 操作付将执行全交给另一个生成器
function* weaponGenerator() {
yield 1;
yield* Ninja();
yield 3;
}
function* Ninja() {
yield 4;
yield 5;
yield 6;
}
let a=weaponGenerator();
console.log(a.next()); //{ value: 1, done: false }
console.log(a.next());//{ value: 4, done: false }
console.log(a.next());//{ value: 5, done: false }

promise

const ninja=new Promise((res,rej)=>{
res("成功");
rej("失败")
});
ninja.then(res=>{
console.log(res);
}).catch(rej=>{
console.log(rej);
})

原型

函数(Function)才有prototype属性,对象(除Object) 拥有__proto__
函数与函数之间的继承 原型继承
function Person(){}
Person.prototype.dance = function () {}; function Ninja(){}
Ninja.prototype = new Person();
const a = new Ninja();

继承

ES5继承

function Person(){}
Person.prototype.dance=function(){}; function Ninja(){}
Ninja.prototype=new Person();
Object.defineProperty(Ninja.prototype,"constructor",{
enumerable:false,
value:Ninja,
writable:true
}); ES6继承 class Person{
constructor(name) {
this.name=name
}
dance(){
return true;
}
}
class Ninja extends Person{ //关键字 extends 实现继承
constructor(name,weapon){
super(name);
this.weapon=weapon;
}
}

原型对象

只要创建一个新函数,然后给该函数创建一个prototype属性,这个属性指向函数的原型对象

function Person{}
person.prototype.name="Nicholas"
var person1=new Person();

对象的访问

在函数中 getter与setter控制属性访问

function Ninja(){
let skillLevel;
//getter方法控制对私有变量的访问
this.getSkill=()=>skillLevel;
// getter 方法控制对私有变量的复制
this.setSkill=value=>skillLevel=value;
}
let a=new Ninja();
a.setSkill('xiaoming');
console.log(a.getSkill());

在对象字面量中定义 getter 和setter

const a = {
arr: ['yosi', 'xiao', 'hattori'],
get firstGet() {
return this.arr[0]
},
set firstSet(value) {
return this.arr[0] = value
}
};
a.firstSet='lisi';// set 应该是赋值表达式的右边部分
console.log(a.firstGet);

ES6的class使用getter和seter

class Ninja{
constructor(){
this.arr = ['a', 'b', 'c'];
}
get firstNinja(){
return this.arr[0]
}
set firstNinja(value){
this.arr[0]=value
}
} let a = new Ninja();
a.firstNinja='d';
console.log(a.firstNinja);

Object.defineProperty定义getter和setter方法

function Ninja(){
let a=0;
Object.defineProperty(this,'a',{
get(){
return a
},
set(value){
a=value
}
})
}
let nin = new Ninja();
nin.a=2;
console.log(nin.a);

使用getter与setter校验属性值

function Ninja(){
let a=0;
Object.defineProperty(this,'a',{
get(){
return a
},
set(value){
if (!Number.isInteger(value)) {
throw new TypeError('不是整数')
}
a=value
}
})
}
const p = new Ninja();
p.a='s';//报错
console.log(p.a);

使用getter与setter定义计算属性值

const a={
name:'xiaoming',
age:12,
get getAll(){
return this.name+'---'+this.age
},
set setAll(value){
const segments = value.split('');
this.name=segments[0];
this.age = segments[1];
}
};
a.setAll = 'ab';
console.log(a.getAll); // a---b
console.log(a.name); //a
console.log(a.age); //b

Proxy

Proxy 对象对于定义基本操作的自定义行为
语法
let p=new Proxy(target,handler);
参数
target 目标对象
handler 一个对象,其属性是执行操作的行为函数 给不存在属性名,返回数为37
let handler={
get(target,name){
return name in target?target[name]:37;
}
};
let p = new Proxy({}, handler);
p.a=1;
p.b=2;
console.log(p.c);//37 ---------
const a = {name: 'lisi'};
const rep = new Proxy(a, {
get(target, key) {
return key in target ? target[key] : '报错啦';
},
set(target, key, value) {
return target[key] = value
}
});
rep.s=1;
console.log(rep.l);//报错了 ----------
function Ninja() {
let a = 0;
Object.defineProperty(this,'a',{
get(){
return a
},
set(value){
a=value
}
})
} const nin = new Ninja();
nin.a=2;
console.log(nin.a);
-------
function makeLoggable(target){
return new Proxy(target,{
get(target,key){
return target[key]
},
set(target,key,value){
target[key]=value
}
})
}
let ninja={name: 'xiaoming'};
let a = makeLoggable(ninja);
a.sex = '男';
console.log(a); ------
function Folder() {
return new Proxy({}, {
get(target, key) {
if (!(key in target)) {
target[key] = new Folder();
}//如果对象不具有该属性,则创建该属性
return target[key]
}
})
} const rootFolder = new Folder();
try {
rootFolder.name.sss.ggg.ddd = 'xxx';//不会报错
} catch (e) {
fail('报错!')
}

使用代理实现数组负索引

const ninjas = ['a', 'b', 'c'];

console.log(ninjas[-2]);//js不支持数组负索引
console.log(ninjas.slice(-1)); function createArray(array) {
if (!Array.isArray(array)) {
throw new TypeError('不是数组,报错')
}
return new Proxy(array,{
get(target,key){
key=+key;
return target[key < 0 ? target.length + key : key];
},
set(target, key, value) {
key=+key;
return target[key<0?target.length+key:key]=value
}
})
} const arr = ['a', 'b', 'c', 'd'];
const proxyArr = createArray(arr);
console.log(proxyArr[-2]);

创建数组

创建数组有两种方式
内置Array构造函数
const arr=[1,2,3,4]
使用数组字面量
const sum=new Array('a','b','c') push pop 比 shift,unshift 快

模块化

# 使用对象,闭包和立即执行函数实现模块
ES6模块 export const ninja='xiaoming' 导出
export default xxxx 默认导出
export {name as xxx} 别名导出 import {name,age} from 'xxx' 导入命令导出
import * as xxx from 'xxx' 导入模块中声明的全部内容

###############...............................................................................................................................................................................................................................................................................

javascript 忍者秘籍读书笔记(二)的更多相关文章

  1. javascript 忍者秘籍读书笔记

    书名 "学徒"=>"忍者" 性能分析 console.time('sss') console.timeEnd('sss') 函数 函数是第一类对象 通过字 ...

  2. 《JavaScript 高级程序设计》读书笔记二 使用JavaScript

    一   <script>元素 a.四个属性: async:立即异步加载外部脚本: defer:延迟到文档完全被解析再加载外部脚本: src:外部脚本路径: type:脚本语言的内容类型: ...

  3. JavaScript DOM编程艺术读书笔记(二)

    第五章 最佳实践 平稳退化(graceful degradation):如果正确使用了JavaScript脚本,可以让访问者在他们的浏览器不支持JavaScript的情况下仍能顺利地浏览你网站.虽然某 ...

  4. JavaScript DOM 高级程序设计读书笔记二

    响应用户操作和事件 事件就是操作检测与脚本执行的组合,或者基于检测到的操作类型在某个对象上调用事件侦听器(事件处理程序). 事件的类型 事件可以分为几种类型:对象事件,鼠标事件,键盘事件(只适用于do ...

  5. 《javascript权威指南》读书笔记——第二篇

    <javascript权威指南>读书笔记——第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字 ...

  6. 《javascript权威指南》读书笔记——第一篇

    <javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...

  7. 【记】《.net之美》之读书笔记(二) C#中的泛型

    前言 上一篇读书笔记,很多小伙伴说这本书很不错,所以趁着国庆假期,继续我的读书之旅,来跟随书中作者一起温习并掌握第二章的内容吧. 一.理解泛型 1.为什么要使用泛型?-----通过使用泛型,可以极大地 ...

  8. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  9. 《你必须知道的.NET》读书笔记二:小OO有大原则

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

随机推荐

  1. Shell 编程 until语句

    本篇主要写一些shell脚本until语句的使用. 计算1-50的和 #!/bin/bash i=0 s=0 until [ $i -eq 51 ];do let s+=i;let i++ done ...

  2. 安装Ubuntu后需要做的事

    卸载软件 纸牌 麻将 扫雷 数独 火狐 邮件 扫描 拍照 照片 视频 计划 日历 打印 备份 计算器 亚马逊 电源统计 音乐播放 远程桌面 To Do LibreOffice 换下载源 装机的时候下载 ...

  3. 使用Qemu运行Ubuntu文件系统 —— 搭建SVE学习环境(2)

    开发环境 PC:ubuntu18.04 Qemu:4.1 Kernel:Linux-5.2 概述 由于要学习ARM的SVE技术,但是目前还没有支持SVE指令的板子,所以只能用Qemu来模拟,但是发现Q ...

  4. Xpath re bs4 等爬虫解析器的性能比较

    xpath re bs4 等爬虫解析器的性能比较 本文原始地址:https://sitoi.cn/posts/23470.html 思路 测试网站地址:http://baijiahao.baidu.c ...

  5. mysql binlog空间维护

    默认情况下,mysql主从同步的binlog日志,会一直保存. 对于如果已同步好的数据,这显然比较浪费资源. 且如果生产环境磁盘太小,随时还会爆掉,所以很有必要作好binlog的空间维护. 以下操作, ...

  6. jq node.js bootstrap

    1.node.js 网址:https://nodejs.org/en/ 用来通过下载node.js 来引用里面的npm 来实现对外部项目的下载 1.安装nodejs 自带了npm npm instal ...

  7. 使用ARP获取局域网内设备IP和MAC地址

    根据Arp列表数据,查询本地设备在线状态 使用 arp -a 获得所有内网地址,首先看Mod对象 public struct MacIpPair { public string HostName; p ...

  8. 访问控制 RAM(Resource Access Management),知识点

    资料 网址 什么是访问控制 https://help.aliyun.com/document_detail/28672.html?spm=5176.11065259.1996646101.search ...

  9. Jmeter函数助手—自带方法

    1.${__time()}---->当前时间,一串数字格式 2.${__time(yyyy-MM-dd)}----->当前日期,年-月-日格式 3.${__time(yyyy-MM-dd ...

  10. time、datetime

    目录 time() datetime() time() python的时间模块 时间戳: 给电脑看的.1970-01-01 00:00:00到当前时间,按秒计算 格式化时间(Format String ...