JavaScript笔记(八)

自定义继承:

1. 仅修改一个对象的父对象:
obj.__proto__=father
问题: __proto__是内部属性,本不能直接使用。
解决:
Object.setPrototypeOf(child,father)
设置child继承father
Object.getPrototypeOf(child)
获得child的父对象
问题: 每次只能修改一个对象的父对象
2. 批量修改所有子对象的父对象:
修改构造函数的原型对象:
构造函数.prototype=father
时机: 在定义完构造函数后,在开始创建第一个子对象之前。
3. 两种类型间的继承:
  问题: 两种类型间,有相同的属性和方法
解决: 抽象出一个公共的父类型,集中保存两种类型相同的属性结构和方法
如何实现: 3步:
1. 定义父类型构造函数和原型对象
2. 在子类型构造函数中借用父类型构造函数
如何借用: call和apply
父类型构造函数.apply(this,arguments)
call和apply: 专门用于借用一个函数,并替换函数中的this为指定对象。
何时使用: 今后,只要函数中的this不是想要的,都要用call和apply更换。

相同: 借用函数,替换this
不同: call要求传入函数的参数必须独立传入。
apply要求传入函数的参数必须放入一个数组或集合中,整体传入
如何使用:
函数.call(
替换this的对象,要传给函数的参数)

3. 让子类型的原型对象继承父类型的原型对象。
Object.setPrototypeOf(
子类型的原型对象,
父类型的原型对象
);

ES5:
对象的属性:
ES5中提供了对对象属性的保护
命名属性: 凡是可用.直接访问的属性
数据属性: 直接存储属性值的属性

每个数据属性都有四大特性:
value: 实际存储属性值
writable: true/false 是否可修改
enumerable:true/false 是否可遍历
configurable:true/false

是否可修改或删除其他特性
如何读取一个属性的特性:
Object.getOwnPropertyDescriptor(
obj,"属性名"
)//返回一个对象,包含四大特性
特性的默认值:
用传统方式添加的属性,四大特性都是true。
如何设置属性的特性:
Object.defineProperty(obj,"属性名"{
特性:值,
...:...
})
问题: 任何时候都可用defineProperty将特性恢复原样
解决: 修改特性同时,都要将configurable设置为false
configurable一旦被改为false,则不可逆。

访问器属性: 不直接存储属性值,仅提供对其他属性的保护
内部属性: 不允许打.直接访问的属性
比如: class __proto__

四大特性:
get:function(){return xxx}
set:function(val){
验证val
xxx=val
}
enumerable:
configurable:
何时使用: 只要用自定义的规则保护属性时,都要用访问器属性
如何使用: 2步:
1. 定义数据属性,实际存储属性值
问题: 使用者可直接操作数据属性,而绕过访问器属性的保护。
解决: 闭包!
2. 定义访问器属性,保护数据属性
只能用defineProperty()
Object.defineProperty(obj,"属性名",{
get:function(){return xxx},
set:function(val){xxx=val},
enumerable:
configurable:
})
get/set方法都不用手动调用:
只要用访问器属性取值时,自动调get()
只要用访问器属性赋值时,自动调set()
set中的参数val,会自动获得要赋的值
构造函数中的访问器属性:
鄙视: 实现一个类型,同时包含public公有属性和private私有属性
private私有属性: 仅在对象内部使用的属性,无法通过.访问到。
public公有属性: 直接用对象.可访问到的属性。

防篡改: 禁止添加,删除,修改对象的属性
1. 防扩展:
每个对象中,都有一个默认的内部属性:
extensible,默认为true,说明随时可扩展新属性。
如果修改extensible属性为false,则禁止扩展新属性
如何修改:
Object.preventExtensions(obj)
阻止对obj对象的一切扩展
问题:只限制添加新属性,不限制删除旧属性
2. 密封: 在防扩展的基础上,修改所有属性的configurable特性为false
如何密封: Object.seal(obj);
将obj对象密封
3. 冻结: 在密封基础上,禁止修改所有属性的值。
Object.freeze(obj);

Object.create():创建一个新对象,继承指定的父对象,同时为新对象扩展新属性
何时使用: 只要基于一个现有父对象,创建一个子对象时。
如何使用:
var child=Object.create(father,{
新属性:{四大特性},
...:...
})

数组API: 
1. 判断: 数组中的元素是否符合要求: 
arr.every(...):判断arr中所有元素是否都符合要求。
arr.some(...):判断arr中是否包含符合要求的元素。
如何使用: 
var bool=arr.every(
function(val,idx,arr){
return 判断条件
}
);
every会用function去arr中每个元素执行检查。只有每个元素的执行结果都为true时,才返回true。只要任意一个不返回true,则every立刻返回false。
说明: 
val: 自动获得当前正在检查的元素值
idx: 自动获得当前正在检查的元素位置
arr: 自动获得当前正在检查的数组对象
2.遍历: 对数组中的每个元素执行相同个操作
arr.forEach(...):依次对arr中每个元素执行相同的操作,再保存回原数组。
直接修改原数组
arr.map(...): 依次取出arr中每个元素的值,执行相同操作,再保存到新数组中
不直接修改原数组,返回新数组

3.过滤和汇总:
过滤: 筛选出arr中符合条件的元素,组成新数组。
var sub=arr.filter(function(val,idx,arr){
return 条件
})
不修改原数组。

汇总: 将当前数组中的所有元素,统计出一个结果。
var r=
arr.reduce(function(prev,val,idx,arr{
return 将val汇总到prev中的结果
},base)
依次将arr中每个值,汇总到prev中。
说明:prev获得的是截止idx位置之前的所有元素值的临时汇总
base,用来设置起始的汇总值。

2.bind
bind:基于一个现有函数,创建一个新函数,同时永久绑定this对象和部分参数。
为什么:
call和apply:
临时借用函数,替换其中的this,传入参数。
问题: 临时借用,临时替换this
解决:bind
何时使用: 永久绑定this和部分参数时
如何使用:
var fun=Fun.bind(obj,参数1,参数2,...)
基于已有的Fun函数,返回一个新函数,同时永久绑定新函数中的this为obj,同时绑定部分参数值为参数1,参数2,

3. 严格模式:
启用:代码段顶部:"use strict";
2处:
1.script的开始
2.函数的开始
规则:
1. 将静默失败,升级为错误
2. 禁止对未声明过的变量赋值
(function(){"use strict";
m=12;//报错
})();
console.log(m);//12
3. 禁用了arguments.callee
(function(){"use strict";
argument.callee();
})();
4. 多了eval作用域
(function(){"use strict";
eval("var sum=2+3");
console.log(sum);
})()

时间: 2024-10-03 13:30:01

JavaScript笔记(八)的相关文章

jQuery整理笔记八----jQuery的Ajax

Ajax,我一直读的是"阿贾克斯",据当时大学老师讲该读音出处是根据当年风靡欧洲的荷兰足球俱乐部阿贾克斯的名字来的,我觉得说法挺靠谱的. jQuery封装了Ajax的交互过程,用户不需要考虑XMLHttpRequest对象的兼容性问题以及使用XMLHttpRequest建立连接.发送请求.发送方式.接收方式等细节,利用jQuery定义 的几个简单方法,即可轻松实现客户端与服务端异步通信的问题,从而帮助开发人员从繁琐的技术细节中解脱出来,专心于业务层开发工作. 最初始的JavaScrip

JavaScript笔记之Function

一.函数定义 (1)使用function declaration 格式:function functionName(parameters) { function body } 注:此种方式声明的函数作用域是全局的,即在声明之前可以调用 (2)使用function expression 格式:var name = function (parameters) { function body }; 注:与(1)不同,在声明之前不可以调用 (3)使用function constructor() 格式:v

老男孩培训视频听课笔记八(在51cto上听的)--5.8 64bit 基础优化

windows user: administrator guest port 3389 Linux user:root 普通用户很多 Port :22 更改ssh登录配置: 位置: /etc/ssh/ssh_config-client 配置 /etc/ssh/sshd_config --服务器端的配置 修改:第一步,备份服务器端的配置   第二步,编辑--说明 #--注释说明 图:   /etc/init.d – yum /rpm 安装的软件全部在这有启动命令 修改后不能登录,用图标来解释如何判

angular学习笔记(八)

本篇介绍angular控制视图的显示和隐藏: 通过给元素添加ng-show属性或者ng-hide属性来控制视图的显示或隐藏: ng-show: 绑定的数据值为true时,显示元素,值为false时,隐藏元素 ng-hide: 绑定的数据值为true时,隐藏元素,值为false时,显示元素 (其实只要用到其中一个就可以了) 下面来看个简单的例子,点击按钮可以显示/隐藏元素: <!DOCTYPE html> <html ng-app> <head> <title>

javascript笔记(二)

concat() 连接多个字符串,返回合并后的字符串. 1 var s1="a"; 2 var s2="b"; 3 var s3="c"; 4 5 console.log(s1.concat(s2,s3));//abc concat() 方法的结果等同于:result = s1 + s2 + ... + sN.如果有不是字符串的参数,则它们在连接之前将首先被转换为字符串. 数组中的concat():将参数添加为数组的元素,返回新的数组. 1 va

Linux System Programming 学习笔记(八) 文件和目录管理

1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是LInux内核通过数据结构表示的实体 inode存储相关联文件的元数据 ls -i 命令获取文件的inode number /* obtaining the metadata of a file */ #include <sys/types.h> #include <sys/stat.h>

马哥学习笔记八——LAMP编译安装之PHP及xcache

1.解决依赖关系: 请配置好yum源(可以是本地系统光盘)后执行如下命令: # yum -y groupinstall "X Software Development" 如果想让编译的php支持mcrypt扩展,此处还需要下载如下两个rpm包并安装之: libmcrypt-2.5.7-5.el5.i386.rpm libmcrypt-devel-2.5.7-5.el5.i386.rpm 2.编译安装php-5.4.13 首先下载源码包至本地目录. # tar xf php-5.4.13

Lua学习笔记(八):数据结构

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在Lua中table很好的实现了这些数据结构. 1.数组 在Lua中通过整数下标访问table中元素,既是数组,并且数组大小不固定,可动态增长.通常我们初始化数组时,就间接地定义了数组的大小,例如: 1 a = {} -- new array 2 for i=1, 1000 do 3 a[i] = 0 4 end 5 6 --数

初探swift语言的学习笔记八(保留了许多OC的实现)

尽管swift作为一门新语言,但还保留了许多OC的机制,使得swift和OC更好的融合在一起.如果没有OC基础的先GOOGLE一下. 如:KVO,DELEGATE,NOTIFICATION. 详见DEMO. import Foundation @objc // 需要打开objc标识,否则@optional编译出错 protocol kvoDemoDelegate { func willDoSomething() @optional func didDoSomething() //可选实现, }

[Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+1}" 反射获取函数源代码的功能很强大,使用函数对象的toString方法有严重的局限性.toString方法的局限性ECMAScript标准对函数对象的toString方法的返回结果(即该字符串)并没有任何要求.这意味着不同的js引擎将产生不同的字符串,甚至产生的字符串与该函数并不相关. 如果函数