> 变量、作用域和内存问题
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高级程序设计的更多相关文章

  1. 读书笔记-JavaScript高级程序设计(1)

    1.组合继承 (JavaScript 中最常用的继承模式 ) (position: page168) (书中定义了两个变量名 SuperType   SubType  乍一看 感觉不太能区分,我将改为 ...

  2. 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript

    1 <script>的6个属性 async  立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer  文档显示之后再执行脚本,只对外部脚本有效 lan ...

  3. 读书笔记 - javascript 高级程序设计 - 第一章 简介

      第一章 简介   诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262  一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...

  4. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

    读书笔记 - js高级程序设计 - 第十三章 事件   canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好   有时候即使浏览器支持,操作系统如果缺缺 ...

  5. 读书笔记 - js高级程序设计 - 第十章 DOM

      文档元素 是文档的最外层元素,在Html页面中,文档元素始终都是<html>元素 在xml中,任何元素都可以是文档元素 Node类型 Node.ELEMENT_NODE 元素 Node ...

  6. 读书笔记 - js高级程序设计 - 第八章 BOM

      BOM的核心对象是window 它表示浏览器的一个实例,在浏览器中,window对象有双重角色,它既是通过js访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,这意味着在网 ...

  7. 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3

      Node类型的变化   访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...

  8. 读书笔记 - js高级程序设计 - 第十一章 DOM扩展

      对DOM的两个主要的扩展 Selectors API HTML5  Element Traversal 元素遍历规范 querySelector var body = document.query ...

  9. 读书笔记 - js高级程序设计 - 第七章 函数表达式

      闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...

  10. 读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计

      EcmaScript有两种属性 数据属性 和 访问器属性 数据属性有4个特性 Configurable Enumerable Writable Value   前三个值的默认值都为false   ...

随机推荐

  1. Linux 下的 fork()【转载】

    [原文地址]http://blog.csdn.net/hikaliv/article/details/4276758 [cpp] view plaincopy   for( i = 0; i < ...

  2. c语言各类问题 代码

    定义一个结构体,有两个成员变量,一个整型的n,一个字符型的c,利用结构体类型声明一个具有5个元素的数组,并随机初始化,根据成员变量n进行从小到大排序,然后输出 冒泡排序然后 在输出结构体#includ ...

  3. 前端笔试题2 JS部分

    笔试题2 var EventME = {}; EventME.addHandle = function(ele, eventName, handleFunction) { if (ele.addEve ...

  4. Http报文格式学习及Get和Post主要区别总结

    HTTP(HyperText Transport Protocol,超文本传送协议) http请求数据包的格式:头部(request line + header)+  数据(data) 头部和数据包体 ...

  5. 查看Xcode所使用Swift的版本

    查看Swift版本 $ xcrun swift -version 查看Xcode位置 $ xcrun --find swift 参考链接:http://stackoverflow.com/questi ...

  6. 使用Boost.Asio编写通信程序

    摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...

  7. 1148 - Mad Counting(数学)

    1148 - Mad Counting   PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: 32 MB M ...

  8. MVC3 验证码

    public ActionResult GetValidateCode()        {                         string code = CreateValidateC ...

  9. MD5算法【计算文件和字符串的MD5值】

    1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...

  10. 密封关键字sealed

    在两种情况下使用: ·不想让别人继承:例如public sealed class Person{}; ·不想让子类重写自己的方法 例如: public class Person{ public vis ...