> 变量、作用域和内存问题
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. c 语言简单计算器源码

    //  main.c //  计算器 //  Created by qianfeng on 14-7-15. //  Copyright (c) 2014年 ___FGY___. All rights ...

  2. ASP.NET jQuery 随笔 使用allValidator插件简单实现客户端验证功能

    首先放出该插件的下载地址:http://pan.baidu.com/s/1Aa3yD,里面有帮助文档,详细了解可以自行下载学习,本章只讲解一些基本的验证功能,页面代码如下: <%@ Page L ...

  3. 转: angularjs学习总结(~~很详细的教程)

    1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...

  4. 射频识别技术漫谈(22)——RC系列射频芯片的寄存器操作

    前面提到,RC系列内部64个寄存器的正确操作是软件编写的关键.正确设置寄存器首先要做到与寄存器正确通信,其次是要对寄存器写入正确的值. RC系列射频芯片与微控制器的接口有并口和SPI接口两种类型.显然 ...

  5. Python中type与Object的区别

    Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: clas ...

  6. Windows Azure 成为业内首家被授权为 FedRAMP JAB P-ATO 的供应商

    编辑人员注释:本文章由 Windows Azure 业务和运营部门产品市场营销总监 Sarah Fender 撰写 我们高兴地宣布,Windows Azure 被 FedRAMP 联合授权董事会 (J ...

  7. DontDestroyOnLoad(Unity3D开发之五)

    Unity中我们从A场景切换到B场景的时候,A场景全部对象都会销毁,但有时候我不须要销毁某些东西. 比方一个简单的游戏的背景音乐,我不须要多次反复创建,多个场景播放这一个即可了.这个时候就须要用到Do ...

  8. 详解虚拟机(windows)下搭建SVN服务器

    安装前的准备 1.虚拟机的用户名最好是英文 2.严格按照步骤做,否则有可能不成功 3.如果安装失败,在虚拟机下的控制板完全下载VisualSVN-Server-2.7.7,重新安装 软件下载地址: h ...

  9. 「Foundation」结构体

    一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框架中的数据类型,那么包含它的主头文 ...

  10. 进度记录 和 安装imagick时Cannot locate header file MagickWand.h错误的解决

    修改php.ini文件,已使php支持扩展的功能 [root@localhost imagick-2.2.2]# ./configure --with-php-config=/usr/local/ph ...