读书笔记:javascript高级程序设计
> 变量、作用域和内存问题
js为弱类型的语言 变量的值和数据类型可以在脚本的生命周期内改变。
5种基本类型:string, number, undefined, null, boolean,基本数据类型是按值访问的。
引用类型是保存在内存中的对象,js不能直接操作对象的内存空间。引用类型是按引用访问的。
动态的属性
对象的属性可以随时添加和删除 delete运算符
不能给基本类型添加属性 如:
var name = "myname";
name.age = 18;
console.log(name.age); //undefined
基本类型和引用类型的赋值,基本类型赋的是值,引用类型赋的是引用 ~~~引用类型变量中存储的是对象的指针 堆内存 栈内存
var n = 1; var m = n; n = 100; console.log(m,n);
var arr1 =[1,2]; var arr2 = arr1; arr1.push(3); console.log(arr1,arr2);
参数传递
ES中所有函数的参数传递都是按值传递的(基本类型变量保存的是真实的值,引用类型变量保存的是指针),实参会被复制一份 赋值给形参。
arguments对象默认自动创建,除非在函数内声明了同名的arguments局部变量
> in搜索原型链,如果继承层次深 性能会不太好, hasOwnProperty只搜索本地属性
in
for in
遍历出可枚举的属性
自定义的属性默认都可枚举 o.a='33'
> Object.prototype对象提供的方法
hasOwnProperty()
propertyIsEnumerable()
isPrototypeOf
toString()
toLocaleString()
valueOf()
~~~instanceof 运算符 和 isPrototypeOf 检测原型对象和实例的关系
~~~原型链中查找属性,作用域链中查找变量
~~~执行上下文EC (变量对象 活动对象, 作用域链, thisValue )
~~~实例化之后,重写构造函数的原型对象,会导致之前的实例和新原型之间无任何关系
如
function Foo(){}
Foo.prototype.hi = 'night';
var f = new Foo();
Foo.prototype={hi:'hello'};
var f2 = new Foo()
console.log(f.hi, f2.hi);
> 创建自定义类的方式
1. 工厂模式 ~~~函数内部创建对象,添加属性和方法,然后返回该对象 缺点无法确定实例类型 占内存
function foo(n){
var o = new Object();
o.a = 100
o.name = n
o.say = function(){ alert(this.a) }
return o;
}
var o1 = foo('a'); var o2 = foo('b');
2. 构造函数模式 ~~~ new一个对象 所有属性和方法都在构造函数内指定 缺点 占内存
function Foo(n){
this.a = 100;
this.n = n;
this.say = function(){ alert(this.n);}
}
var o1 = new Foo('1'); o2 = new Foo('b');
3. 原型模式 ~~~ 空构造函数 所有属性和方法都在原型中指定 缺点:无法传参数 实例共享引用类型的属性,对其修改会影响所有其他实例
function Foo(n){}
Foo.prototype = { a:100, n:'hi', say:function(){ alert(this.a)}, arr:[1,2,3]}
var o1=new Foo(); var o2 = new Foo(); o1.arr.push(4);
4.组合模式 ~~~ 在构造函数中添加实例属性,在原型中添加共有属性
function Foo(n){
this.a = 100;
this.n = n;
}
Foo.prototype= {hi:function(){alert(this.n);}, constructor: Foo };
5. 动态原型模式 ~~~无需在构造函数和原型中分别定义 才构成一个类,直接在构造函数中初始化原型对象 ** 推荐 组合方式或动态原型方式创建类 **
function Foo(n){
this.a = 100;
this.n = n;
if(!Foo.prototype.hi){ //假设hi是 原型对象中肯定会有的属性,从而判断原型是否已经初始化, 只在第一次实例化时会执行
Foo.prototype.hi = function(){ alert(this.n);};
Foo.prototype.go = function(){ console.log( 'go school');};
}
}
> 实现私有数据成员
function Foo(n,a){ //n a 为私有数据成员 ,只有o可以访问
var o = new Object();
o.say = function(){
return a;
}
return o
}
> 接口继承和实现继承
读书笔记:javascript高级程序设计的更多相关文章
- 读书笔记-JavaScript高级程序设计(1)
1.组合继承 (JavaScript 中最常用的继承模式 ) (position: page168) (书中定义了两个变量名 SuperType SubType 乍一看 感觉不太能区分,我将改为 ...
- 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript
1 <script>的6个属性 async 立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer 文档显示之后再执行脚本,只对外部脚本有效 lan ...
- 读书笔记 - javascript 高级程序设计 - 第一章 简介
第一章 简介 诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262 一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
- 读书笔记 - js高级程序设计 - 第十章 DOM
文档元素 是文档的最外层元素,在Html页面中,文档元素始终都是<html>元素 在xml中,任何元素都可以是文档元素 Node类型 Node.ELEMENT_NODE 元素 Node ...
- 读书笔记 - js高级程序设计 - 第八章 BOM
BOM的核心对象是window 它表示浏览器的一个实例,在浏览器中,window对象有双重角色,它既是通过js访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,这意味着在网 ...
- 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3
Node类型的变化 访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...
- 读书笔记 - js高级程序设计 - 第十一章 DOM扩展
对DOM的两个主要的扩展 Selectors API HTML5 Element Traversal 元素遍历规范 querySelector var body = document.query ...
- 读书笔记 - js高级程序设计 - 第七章 函数表达式
闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...
- 读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计
EcmaScript有两种属性 数据属性 和 访问器属性 数据属性有4个特性 Configurable Enumerable Writable Value 前三个值的默认值都为false ...
随机推荐
- 利用反馈字段给帝国cms添加留言板功能(图文教程)
帝国cms的插件中提供信息反馈字段,很多人却不会用.这里谢寒教大家如何来给自己的帝国cms网站添加留言板功能 1.找到添加地址 2.添加字段 3.你可以在字段中添加多种字段类型(有文本域,单行文本框, ...
- HDU 2147 kiki's game
题解:画图可得当横纵坐标均为奇数时为必败态…… #include <cstdio> int main(){ int a,b; while(scanf("%d%d",&a ...
- HDU 1104 Remainder( BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 用elasticsearch索引mongodb数据
参照网页:单机搭建elasticsearch和mongodb的river 三个步骤: 一,搭建单机replicSet二,安装mongodb-river插件三,创建meta,验证使用 第一步,搭建单机m ...
- linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其它g++版本号未知)
一.描写叙述 眼下已经linux64位系统中g++4.4.7下发现了该bug.其它的版本号还未測试. 经測试,假设传入wcsncpy函数第一个參数(即目标缓冲区)的地址不能被4整除的话就必然会发生段错 ...
- hql中不能写count(1)能够写count(a.id)
hql中不能写count(1)能够写count(a.id)里面写详细的属性 String hql="select new com.haiyisoft.vo.entity.cc.repo.Bu ...
- [学习笔记]jQuery实现一些动画效果的方法
jQuery实现效果的方法 1,隐藏和显示:hide(),show(),toggle() // [ˈtɑ:gl]切换 语法: $(selector).hide(speed,callback); $( ...
- webform中listbox运用,2个相互传值练习1:
AppendDataBoundItems(将数据绑定项追加到静态声明列表项上)属性改为Ture;SelectionMode(列表的选择模式改为多项)属性改为Multiple using System; ...
- 远程唤醒、WOL、Magic_Packet
背景:很多人熟悉远程桌面并经常地利用它所带来的方便,但是前提是服务器(远程电脑)必须是处于开机状态.对于机房里有专人管理的服务器,这点不成问题,但如果是放在家里的电脑,要让它7*24地开机似乎就不好办 ...
- 学习MVC遇到的问题
修改电脑上的DNS配置: Opendns 首选DNS服务器和备用DNS服务器分别设置为208.67.222.222和208.67.220.220 google的8.8.8.8 首选DNS服务器和备用D ...