转载请声明出处 博客原文
随手翻阅以前的学习笔记,顺便整理一下放在这里,方便自己复习,也希望你有也有帮助吧
第一课时 入门基础
知识点 :
操作系统就是个应用程序
只要是应用程序都要占用物理内存
浏览器本身也是一个应用程序
浏览器本身只懂得解析HTML
调用浏览器这个应用程序的一个功能绘制
1、javascript介绍
2、基于对象的内存管理
javascript
就是来操作这些对象
通过逻辑组织对象之间的关系和行为
如何操作这些对象?通过变量引用
3、变量
变量本质是一个空盒子,里面记录了一个内存地址,使能找到内存中的对象,保存了指向具体的实在的东西的地址
变量存在栈中,对象存在堆中
变量的意义:方便我们去操作对象
变量的几种引用方式
例如:
var b = document.body
含义:把body
这个对象在内存中的地址放到b变量里面,变量b
(b
是内存地址的别名)本身也存在内存中,以后的操作是针对body
这个地址
变量命名规范
由字母(a-zA-Z
)数字(0-9
)下划线(_
)以及美元符号($
)
不能由数字开头
命名尽量用英文并且具有一定的含义
如果有多个英文单词,后面单词的首字母大写
不能使用关键字
首字母不要大写,大写是有特殊含义的
DOM在内存中的一些图示
DOM Tree
DOM内存图
DOM内存图
DOM内存图
第二课时
回顾上节:
1、javascript
介绍
2、基于对象的内存管理
javascript
就是来操作这些对象
通过逻辑组织对象之间的关系和行为
如何操作这些对象?通过变量引用
3、变量
知识点 :
1、window
作用域
只要在script
标签中定义的变量,默认就在window
的作用域之下
默认就是window
这个对象里面写代码
2、数据类型
如何判断js中的数据类型:
1 2 3 4 5 6 var a = "iamstring." ;var b = 222 ;var c= [1 ,2 ,3 ];var d = new Date ();var e = function ( ) {alert(111 );};var f = function ( ) {this .name="22" ;};
最常见的判断方法 :typeof
1 2 3 4 5 6 alert(typeof a) ------------> string alert(typeof b) ------------> number alert(typeof c) ------------> object alert(typeof d) ------------> object alert(typeof e) ------------> function alert (typeof f ) ------------> function
其中typeof
返回的类型都是字符串形式,需注意,例如:
1 2 alert(typeof a == "string" ) -------------> true alert(typeof a == String ) ---------------> false
另外typeof
可以判断function
的类型;在判断除Object
类型的对象时比较方便。
判断已知对象类型的方法 :instanceof
1 2 3 4 alert(c instanceof Array ) ---------------> true alert(d instanceof Date ) alert(f instanceof Function ) ------------> true alert(f instanceof function ) ------------> false
注意 :instanceof
后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
根据对象的constructor
判断 :constructor
1 2 3 alert(c.constructor === Array ) ----------> true alert(d.constructor === Date ) -----------> true alert(e.constructor === Function ) -------> true
注意 : constructor
在类继承时会出错
例子:
1 2 3 4 5 6 function A ( ) {};function B ( ) {};A.prototype = new B(); var aObj = new A();alert(aobj.constructor === B) -----------> true ; alert(aobj.constructor === A) -----------> false ;
而instanceof
方法不会出现该问题,对象直接继承和间接继承的都会报true
:
1 2 alert(aobj instanceof B) ----------------> true ; alert(aobj instanceof B) ----------------> true ;
言归正传,解决construtor
的问题通常是让对象的constructor
手动指向自己:
1 2 3 aobj.constructor = A; alert(aobj.constructor === A) -----------> true ; alert(aobj.constructor === B) -----------> false ;
通用但很繁琐的方法 : prototype
1 2 3 4 5 6 alert(Object .prototype.toString.call(a) === ‘[object String ]’) -------> true ; alert(Object .prototype.toString.call(b) === ‘[object Number ]’) -------> true ; alert(Object .prototype.toString.call(c) === ‘[object Array ]’) -------> true ; alert(Object .prototype.toString.call(d) === ‘[object Date ]’) -------> true ; alert(Object .prototype.toString.call(e) === ‘[object Function ]’) -------> true ; alert(Object .prototype.toString.call(f) === ‘[object Function ]’) -------> true ;
大小写不能写错,比较麻烦,但胜在通用。
通常情况下用typeof
判断就可以了,遇到预知Object
类型的情况可以选用instanceof
或constructor
方法
Javascript的数据类型有六种(ES6新增了第七种Symbol
)
数值(number
):整数和小数(比如1和3.14)
字符串(string
):字符组成的文本(比如”Hello World”)
布尔值(boolean
):true(真)和false(假)两个特定值
undefined
:表示 未定义 或不存在,即此处目前没有任何值
null
:表示空缺,即此处应该有一个值,但目前为空
对象(object
):各种值组成的集合
通常,我们将数值、字符串、布尔值称为原始类型(primitive type
)的值,即它们是最基本的数据类型,不能再细分了。而将对象称为合成类型(complex type
)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于undefined
和null
,一般将它们看成两个特殊值
内存中一共分为几种对象:
数据类型转换
转换函数
toString()
转换为字符串,在JavaScript中所有数据类型都可以转换为string
类型
1 2 3 4 5 6 7 8 9 10 var n1 = 12 ;var n2 = true ;var a = [1 , 2 , 3 ];var o = {};function f ( ) {}n1.toString(); n2.toString(); a.toString(); o.toString(); f.toString();
强制类型转换
Boolean(value)
- 把给定的值转换成Boolean
型
1 2 3 4 5 6 Boolean (123 ); Boolean ("" ); Boolean ([]); Boolean ({}); Boolean (null ); Boolean (undefined );
Number(value)
-把给定的值转换成数字(可以是整数或浮点数)
1 2 3 4 5 6 7 8 Number ("123" ); Number ("123h" ); Number (true ); Number (false ); Number (undefined ); Number (null ); Number ([]); Number ({});
隐式转换
数字+字符串:数字转换为字符串 console.log(12+"12")
; //1212
数字+布尔值:true
转换为1
,false
转换为0
console.log(12+true)
; //13
字符串+布尔值:布尔值转换为true或false console.log("hello"+true)
; //hellotrue
布尔值+布尔值 console.log(true+true)
; //2
null和undefined
undefined
表示一种未知状态,声明了但没有初始化的变量,变量的值时一个未知状态。访问不存在的属性或对象window.xxx
)方法没有明确返回值时,返回值是一个undefined.
当对未声明的变量应用typeof
运算符时,显示为undefined
。
null
表示尚未存在的对象,null
是一个有特殊意义的值。可以为变量赋值为null
,此时变量的值为“已知状态”(不是undefined
),即null
。(用来初始化变量,清除变量内容,释放内存)
1 2 undefined ==null undefined ===null
3、javascript脚本执行顺序
第一步定义: 分为var
定义 和函数定义function
第二步执行: 其他所有
先从上往下定义完所有的后,再从上往下执行 除了var
function
定义外的 其他都是执行 如:赋值 函数调用
在栈里面找到的,就不去堆里面找,因为栈空间小,就近原则【总之:先在栈里面找,找不到再去堆里面找】在栈里面开辟,就能找到堆里面的地址 如:var b = function(){}
总结一下==
运算的规则:(隐式转换)
JS
中的值有两种类型:原始类型(Primitive
)、对象类型(Object
)。
原始类型包括:Undefined
、Null
、Boolean
、Number
和String
等五种。
Undefined
类型和Null
类型的都只有一个值,即undefined
和null
;Boolean
类型有两个值:true
和false
;Number
类型的值有很多很多;String
类型的值理论上有无数个。
所有对象都有valueOf()
和toString()
方法,它们继承自Object
,当然也可能被子类重写
undefined == null
,结果是true
。且它俩与所有其他值比较的结果都是false
。
String == Boolean
,需要两个操作数同时转为Number
。
String/Boolean == Number
,需要String/Boolean
转为Number
。
Object == Primitive
,需要Object
转为Primitive
(具体通过valueOf
和toString
方法)
第三课时
上节回顾:
知识点:
1、运算符
算术运算符(+
,-
,*
,/
,%
,++
,--
)
如果引用所指的地方是null
的话,那么在运算中就会自动变成0
%
运算符 如:4%5
取模 模是4
7%5
取模 模是7-5=2
字符串和数字相加的情况:
左右都是数字:数字相加
左右有一个字符串:字符串拼接
左右边有一个null
:null
看做0
左右边有一个undefined
:结果是NAN
(not is number
)
赋值运算符(=
,-=
,+=
,*=
,/=
,%=
)
比较运算符(==
,===
,!=
,>
,<
,>=
,<=
)
先执行表达式计算再赋值
==
和!=
在比较之前首先让双方的值做隐士类型转换,===
不转换
逻辑运算符(||
,&&
,!
)
||
在js中和PHP中是不一样的 js中返回逻辑或的左边或右边的一个结果 PHP返回||
或出来以后的结果即:true
false
特殊性(注意)—一定要记住(这个特性和其他编程语言不一样):在js
里返回不是布尔值
||
短路运算 第一个条件为真 后面不执行
&&
把表达式最后一个值返回(注意这里)
条件运符(表达式1?表达式2:表达式3
)三元运算符
表达式1?表达式2:表达式3
表达式1为真 返回表达式2 否则返回表达式3
三元运算符 可以多层次嵌套使用
2、在js中 有四种被认为是非
:
例子:var age = prompt("温馨提示:","请输入您的年龄")||0
当点击取消的时候,如果出现undefined
null
fasle
0
表示非的逻辑 那么||
就会过滤,取右边的值0
第四课时
上节回顾:
1、运算符
算术运算符(+
,-
,*
,/
,%
,++
,--
)
如果+
号左边和右边有一边是字符串类型的数据的话,这个时候就变成字符串拼接
var str = "你好"+123;
//你好123
var count = 2;
var str1 = "你叫了我第"-count+"次";
//你叫了我第2次
如果引用所指的地方是null
的话,那么在运算中就会自动变成0
2、赋值运算符*(=
,-=
,+=
,` =,
/=,
%=`)
3、 比较运算符(==,===,!=,>,<,>=,<=
)
先执行表达式计算再赋值
==
和!=
在比较之前首先让双方的值做隐士类型转换,===
不转换
4、逻辑运算符(||,&&,!
)
5、条件运算符(1>2?3:4
)
知识点:
1、console.log
调试程序
2、条件结构
javascript
中if
语句优化写法
1 2 3 if (foo) bar(); else baz(); ==> foo?bar():baz();if (!foo) bar(); else baz(); ==> foo?baz():bar();if (foo) return bar(); else return baz(); ==> return foo?bar():baz();
1 2 if (foo) bar(); ==> foo&&bar();if (!foo) bar(); ==> foo||bar();
if...else
if...else if...else
当通过判断返回某个值的时候,优先使用三元表达式
当通过判断执行N
段逻辑代码的时候,只能用条件结构
第五课时
上节回顾:
1、console.log
调试程序
2、条件结构 if
if...else
if...else if...else
当通过判断返回某个值的时候,优先使用三元表达式
当通过判断执行N
段逻辑代码的时候,只能用条件结构
知识点:
1、switch
2、for
循环有三个要素
a.循环变量
b.判断(循环体)
c.改变循环变量
d.continue
的意思结束本次循环进入下次循环
continue
结束本次循环,继续下一次循环 当前这次循环不做 直接做下面的
break
结束后面的循环不做了
第六课时
上节回顾:
1、switch
switch case break default
条件 判断 退出 默认
a.只要匹配上一个case
,那么它下面的所有的case
都会执行包括default
b.break
的意思跳出当前结构
2、for
循环有三个要素
a.循环变量
b.判断条件(循环体)
c.改变循环变量
d.continue
的意思结束本次循环进入下次循环
知识点:
1、while/do...while
没有谁好谁坏 只有适应场景不同
比如:先吃饭 在买单 do..while
用户体验高 有风险 扫雷游戏也是先体验 在问是否退出 提高体验
比如:先买单 在吃饭 while
用户体验不高
一般情况下面,如果条件判断是数字的
比较==<>
,for
循环优先.
如果是非数值相关的
比较循环,while
优先
2、代码内存解析
闭包
a.程序永远是先定义后执行
b.执行永远从上到下
c.函数定义的话在堆(只是一个地址而已)
d.函数调用的时候,就会有自己的堆和栈(闭包
)
闭包 作用域
记住:先定义var
function
在从上往下执行
定义定义在自己的栈里面 执行在自己的堆里面
运行在运行的环境中
函数每调用前 只是一个地址
只要调用一次函数就会动态开辟一块内存 创建一个封闭的空间 在自己的封闭的空间的栈中定义var
在执行
函数执行完 里面的东西全部销毁
1 2 3 4 5 6 7 8 9 10 11 12 13 alert(i); var i = 10 ;var j = "你好" ;var k = z = null ;var m = function ( ) { alert(2 ); } var b = document .body;var f = true ;function m ( ) { alert(1 ); }
1 2 3 4 5 6 7 8 9 10 function m ( ) { c = 50 ; alert('哈哈哈' ); } var c = 150 ; m(); var c = 20 ;alert(c);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function m ( ) { c = 50 ; alert('哈哈哈' ); function inner ( ) { c = 30 ; alert('嘻嘻' ); } inner(); } var c = 20 ;m(); alert(c);
4、object对象
5、面向对象的程序设计
a.function
构造器
b.prototype
原型
c.foreach
c.作用域
d.继承
一些内存图示
闭包示例1
闭包示例2
闭包1
闭包2
闭包3
原型链的几张图解
原型链图解
js原型链演示00-new Object
js原型链演示01-函数Foo声明
js原型链演示-对象继承模式-01-浅拷贝
js原型链演示02-new Foo()
js原型链演示02-1-new 原理
js原型链演示03-Foo.prototype
js原型链演示-对象继承模式-03-基于对象的原型继承
js原型链演示05-继承函数示例
js原型链演示06-继承prototype模式
js原型链演示07-继承prototype模式改进
js原型链演示08-继承prototype直接继承
js原型链演示08-继承prototype空对象中介
js原型链演示09-继承prototype空对象中介封装expend
js原型链演示10-构造器拷贝继承
第七课时
上节回顾:
1.switch
2.while/do...while
一般情况下面,如果条件判断是数字的比较==<>
,for
循环优先.
如果是非数值相关的比较循环,while
优先
3.function
函数
4.代码内存解析
闭包
a.程序永远是先定义后执行
b.执行永远从上之下
c.函数定义的话在堆(只是一个地址而已)
d.函数调用的时候,就会有自己的堆和栈(闭包)
知识点:
1、object对象
new 原理详细解析
无论什么时候,只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype
属性,这个属性指向函数的原型对象。
在默认情况下,所有原型对象都会自动获得一个constructor
(构造函数)属性,这个属性包含一个指向prototype
属性所在函数的指针(就是指向新创建的函数)。
通过这个构造函数(原型对象的构造函数),可以继续为原型对象添加其他属性和方法。
当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。ECMA-262
第5版管这个指针叫 [[Prototype]]
。脚本中没有标准的方式访问[[Prototype]]
,但Firefox
、Safari
和Chrome
在每个对象上都支持一个属性__proto__
;而在其他实现中,这个属性对脚本是完全不可见的。不过,要明确的真正重要的一点就是,这个连接存在于实例和构造函数的原型对象之间,而不是存在于实例和构造函数之间
new创建对象的步骤
创建一个新的对象
将构造函数的作用域赋给新对象
执行构造函数的代码,为这个新对象添加属性
返回新对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function Person (name, age ) { this .name = name; this .age = age; this .say = function ( ) { console .log(this .name); }; } function createPerson (P ) { var o = new Object (); var args = Array .prototype.slice.call(arguments , 1 ); o.__proto__ = P.prototype; P.prototype.constructor = P; P.apply(o, args); return o; } var p = createPerson(Person, 'wang' , 35 );
2、面向对象的程序设计
function
构造器
共同点:
不同点:
函数调用是没有办法拿到空间的地址的,而且这块地址是一块临时地址,执行完函数之后,就会销毁
new
开辟内存空间,把这块空间的地址返回,这块空间就有可能长期的被引用
prototype
原型
通过原型使通过同样一个构造器所new(创建)
出来的对象具有相同的属性和行为
prototype
本质就是一个对象
foreach
this
指代当前创建的这块内存 this.name=name
指代当前内存中的这个name
属性 接收外界传过来的值
继承
多种构造函数
传统的创建对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var person = new Object ();person.name = “lancer”; person.age = 24 ; person.job = “UI”; person.sayName = function ( ) { alert(this .name); } person.sayName();
工厂模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function createPerson (name,age,job ) {var o = new Object ();o.name = name; o.age = age; o.job = job; o.sayName = function ( ) { alert(o.name); } return o;} var person1 = createPerson(“lancer”,24 ,”UI”);person1.sayName();
构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function Person (name,age,job ) {this .name = name;this .age = age;this .job =job;this .sayName = function ( ) {alert(this .name) } } var person1 = createPerson(“lancer”,24 ,”UI”);person1.sayName();
原型模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 function Person ( ) {} Person.prototype.name =”lancer”; Person.prototype.age =24 ; Person.prototype.job = “UI”; Person.prototype.sayName = function ( ) { alert(this .name) } var person1 = new Person();person1.sayName(); var person2 = new Person();person2.name =”lara” person2.sayName();
简单原型模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function Person ( ) {} Person.prototype = { name : “lancer”, age : 24 , job : “UI”, sayName : function ( ) { alert(this .name) } }; var person1 = new Person();person1.sayName();
构造函数和原型模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 function Person (name,age,job ) {this .name = name;this .age = age;this .job =job;} Person.prototype = { constructor :Person,sayName : function(){ alert(this .name) } }; var person1 = new Person(“lancer”,”24 ″,”UI”);person1.sayName();
动态原型模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 function Person (name,age,job ) {this .name = name;this .age = age;this .job =job;} if (typeof this .sayName !=”function ”) {Person.prototype = { constructor :Person,sayName : function(){ alert(this .name) } }; } var person1 = new Person(“lancer”,”24 ″,”UI”);person1.sayName();
稳妥构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var Person = function (name,age,job ) {var O = new Object ();O.sayName = function ( ) { alert(name); }; return O} var person1 = Person(“lancer”,24 ,”UI”);person1.sayName();
其他:
函数调用后一定有返回值,没有返回值就是undefined
一些内存图示
第八课时
上节回顾:
1.object对象
new
关键字代表的是新开辟一块内存空间
没有被引用的内存空间,会在适当的时候被销毁
两句代码含义等同
var person = new Object();
var person = {};
访问对象的属性除了用 对象引用属性key
以外,还可以使用对象引用[属性key]
2.面向对象的程序设计
a.function
构造器
共同点:
不同点:
函数调用是没有办法拿到空间的地址的,而且这块地址是一块临时地址,执行完函数之后,就会销毁
new
开辟内存空间,把这块空间的地址返回,这块空间就有可能长期的被引用
b.prototype
原型
通过原型使通过同样一个构造器所new
(创建)出来的对象具有相同的属性和行为
prototype
本质就是一个对象
c.foreach
c.this
d.继承
知识点:
1.prototype内存解析
prototype
是原型,是一块所有对应构造器创建的对象都共享的内存空间
在面向对象设计程序的时候,属性应该是对应的空间的,而功能应该是prototype
公共空间的
2.通过prototype扩展功能
所有的构造器都是继承于Object
构造器的,因此只要Object
的原型里有的功能,所有的对象都有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 function Student (name,age,sex ) { this .name = name; this .age = age; this .sex = sex; } function Bingqilin (name ) { this .name = name; } function Game (name ) { this .name = name; } function Hour (time ) { this .time = time; } Student.prototype = { eat:function (b ) { alert(this .name+"喜欢吃" +b.name); }, mess:function ( ) { alert(this .name+"的信息:" +this .age+',' +this .sex); }, sleep:function (h ) { alert(this .name+"每天睡," +h.time+'小时' ); }, work:function (h ) { alert(this .name+"每天工作," +h.time+'小时' ); }, like:function (g ) { alert(this .name+"喜欢打," +g.name); } } var s = new Student("小明" ,22 ,"男" );var b = new Bingqilin("黑色的冰淇淋" );s.eat(b); var g = new Game("英雄联盟" );s.like(g); var h = new Hour(10 );s.sleep(h); s.work(h);
一些内存图示
第九课时
回顾:
1、prototype内存解析
prototype
是原型,是一块所有对应构造器创建的对象都共享的内存空间
在面向对象设计程序的时候,属性应该是对应的空间的,而功能应该是prototype
公共空间的
2、通过prototype扩展功能
所有的构造器都是继承于Object
构造器的,因此只要Object
的原型里有的功能,所有的对象都有
构造器在定义的时候 就默认创建了一个空的原型
3、封装
1:找对象 小头爸爸 大头儿子 饭
2:抽象(类,构造器)
3:创建对象并且建立关系(操作对象)
面向对象例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 function Person (name,age ) { this .name = name; this .age = age; } function Rice (name ) { this .name = name; } Person.prototype = { getHand:function (person ) { alert(this .name+"在牵着" +person.name+"的手...." ); }, eat:function (rice ) { alert(this .name+"在吃" +rice.name); }, backhome:function ( ) { alert(this .name+"回家" ); }, study:function ( ) { alert(this .name+"正在学习" ); }, watchTV:function (jm ) { alert(this .name+"正在看" +jm+'...' ); } }; var p1 = new Person("老爸" ,20 );var p2 = new Person("儿子" ,15 );Object .prototype.extends = function (func,actions ) { for (var prop in func.prototype){ this .prototype[prop] = func.prototype[prop]; } for (var prop in actions){ this .prototype[prop] = actions[prop]; } }; function Father (name ) { this .name = name; } Father.extends(Person,{ carry:function (person ) { alert(this .name+'背着' +person.name); }, work:function ( ) { alert(this .name+"正在工作" ); } }); function Children (name ) { this .name = name; } Children.extends(Person); function Mother (name ) { this .name = name; } Mother.extends(Person,{ scoop:function (person ) { alert(this .name+"唱着摇篮曲哄" +person.name+"睡觉" ); } }); var p1 = new Father("老爸" );var p2 = new Children("儿子" );p1.carry(p2); p2.study(); p1.work(); p1.watchTV('看足球' ); p2.watchTV('蜡笔小新' ); var p3 = new Mother('围裙妈妈' );p3.scoop(p2);
知识点:
一些内存图示
第十课时
上节回顾:
1.继承
本质就是从一个prototype
对象中把它的功能都copy
到另一个prototype
对象
继承为什么要循环
2.call apply方法的使用
func.call(obj)
:调用func
的时候,以obj
这个对象的作用域去调用
改变函数在调用的时候里面闭包的作用域
call(obj,arg1,arg2,arg3)
;call
第一个参数传对象,可以是null
。参数以逗号分开进行传值,参数可以是任何类型。apply(obj,[arg1,arg2,arg3])
;apply
第一个参数传对象,参数可以是数组或者arguments
对象
知识点:
API application program interface
第一:遇到问题
第二:查资料或者学习 -> 解决问题
第三:记住有这个功能
第四:查资料(百度)
常用API
1.String
2.Array
3.Math Math.random();
4.Date
日期型函数Date
1 2 3 4 5 6 7 8 9 10 11 var myDate = new Date (); var myDate = new Date (yyyy, mm, dd, hh, mm, ss);var myDate = new Date (yyyy, mm, dd);var myDate = new Date (“monthName dd, yyyy hh:mm:ss”);var myDate = new Date (“monthName dd, yyyy”);var myDate = new Date (epochMilliseconds);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 var myDate = new Date ();myDate.getYear(); myDate.getFullYear(); myDate.getMonth(); myDate.getDate(); myDate.getDay(); myDate.getTime(); myDate.getHours(); myDate.getMinutes(); myDate.getSeconds(); myDate.getMilliseconds(); myDate.toLocaleDateString(); myDate.toLocaleTimeString(); myDate.toLocaleString( );
1 2 3 var myDate = new Date ();myDate.setDate(myDate.getDate() + 10 );
1 2 3 var i = daysBetween(beginDate,endDate); var i = beginDate.getTimezoneOffset(endDate);
1 2 3 4 5 6 if ( checkDate(“2006 -01 -01 ”) ){ }var r = /^(\d{2}|\d{4})[\/-]\d{1,2}[\/-]\d{1,2}$/ ;if ( r.test( myString ) ){ }
字符串String型函数API
1 2 3 var myString = new String (“Every good boy does fine.”);var myString = “Every good boy does fine.”;
1 2 3 var myString = “Every ” + “good boy ” + “does fine.”;var myString = “Every “; myString += “good boy does fine.”;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var myString = “Every good boy does fine.”;var section = myString.substring(6 ); var myString = “Every good boy does fine.”;var section = myString.substring(0 ,10 ); var myString = “Every good boy does fine.”;var section = myString.slice(11 ,-6 ); var myString = “Every good boy does fine.”;var section = myString.substr(6 ,4 );
1 2 3 4 5 var myString = “Hello”;var lcString = myString.toLowerCase(); var ucString = myString.toUpperCase();
1 2 3 4 5 6 7 8 9 var aString = “Hello!”;var bString = new String (“Hello!”);if ( aString == “Hello!” ){ } if ( aString == bString ){ } if ( aString === bString ){ }
1 2 3 4 5 var myString = “hello everybody.”;if ( myString.indexOf(“every”) > -1 ){ }
1 2 3 var myString = “I is your father.”;var result = myString.replace(“is”,”am”);
特殊字符
\b
: 后退符
\t
: 水平制表符
\n
: 换行符
\v
: 垂直制表符
\f
: 分页符
\r
: 回车符
\”
: 双引号
\’
: 单引号
\\ 反斜杆
1 2 3 4 5 var myString = “hello”;var code = myString.charCodeAt(3 ); var char = String .fromCharCode(66 );
1 2 3 4 5 6 7 var myString = “hello all”;var code = encodeURI (myString); var str = decodeURI (code);
Math对象型
Math.abs(num)
: 返回num
的绝对值
Math.acos(num)
: 返回num
的反余弦值
Math.asin(num)
: 返回num
的反正弦值
Math.atan(num)
: 返回num
的反正切值
Math.atan2(y,x)
: 返回y
除以x
的商的反正切值
Math.ceil(num)
: 返回大于num
的最小整数
Math.cos(num)
: 返回num
的余弦值
Math.exp(x)
: 返回以自然数为底,x次幂的数
Math.floor(num)
: 返回小于num
的最大整数
Math.log(num)
: 返回num
的自然对数
Math.max(num1,num2)
: 返回num1
和num2
中较大的一个
Math.min(num1,num2)
: 返回num1
和num2
中较小的一个
Math.pow(x,y)
: 返回x
的y
次方的值
Math.random()
: 返回0
到1
之间的一个随机数
Math.round(num)
: 返回num
四舍五入后的值
Math.sin(num)
: 返回num
的正弦值
Math.sqrt(num)
: 返回num
的平方根
Math.tan(num)
: 返回num
的正切值
Math.E
: 自然数(2.718281828459045
)
Math.LN2
: 2
的自然对数(0.6931471805599453
)
Math.LN10
: 10
的自然对数(2.302585092994046
)
Math.LOG2E
: log 2
为底的自然数(1.4426950408889634
)
Math.LOG10E
: log 10
为底的自然数(0.4342944819032518
)
Math.PI
: π(3.141592653589793)
Math.SQRT1_2
: 1/2
的平方根(0.7071067811865476
)
Math.SQRT2
: 2
的平方根(1.4142135623730951
)
Number型 常用的数字函数
1 2 3 var i = 1 ;var i = new Number (1 );
1 2 3 4 5 6 7 8 9 10 11 var i = 1 ;var str = i.toString(); var str = new String (i); i = parseInt (str); i = parseFloat (str);
1 2 3 4 5 6 7 8 9 10 11 var i = 123 ; var str = “string”;if ( typeof i == “number” ){ } i = parseInt (str); if ( isNaN (i) ){ }
1 2 3 4 5 6 7 8 9 10 11 - **小数转整数** var f = 1.5 ;var i = Math .round(f); var i = Math .ceil(f); var i = Math .floor(f);
1 2 3 4 5 6 7 8 9 var i = 3.14159 ;var str = i.toFixed(2 ); var str = i.toPrecision(5 );
1 2 3 4 5 6 var i = parseInt (“0x1f ”,16 );var i = parseInt (i,10 );var i = parseInt (“11010011 ”,2 );
1 2 3 4 5 6 7 var rnd = Math .random();var rnd = Math .floor(Math .random() * n)
5.Regex
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Object .prototype.extends = function (parent ) { for (var prop in parent.prototype){ this .prototype[prop] = parent.prototype[prop]; } } function Person (name ) { this .name = name; } Person.prototype = { eat:function ( ) { alert(this .name+"在吃饭" ); } }; function Father (name ) { this .name = name; } Father.extends(Person); var f = new Father("小头爸爸" ); f.eat();
一些图示
第十一课时
上节回顾:
1.String
2.Math
Math.random()
知识点:
1.Date
日期类
2.Array
3.Regex
a.[]
一个字符的范围
b.有顺序要求的
c.\w==[a-zA-Z0-9_]
\d==[0-9]
d.{count}
设置匹配数量比如\w{5}
e.//
的正则表达式匹配局部,/^$/
的正则表达式是匹配全部
f.()
的作用就是为了分组匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 String .prototype.isEmail = function ( ) { email = this ; if (email.indexOf("@" )!=-1 &&email.indexOf("." )!=-1 ) { if (email.indexOf("@" )<email.lastIndexOf("@" )){ alert("邮箱不合法" ); }else { alert("邮箱合法" ); } } } var email = "jingguanliuye@gmail.com" ;email.isEmail();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Date .prototype.printCalendar = function ( ) {var year = this .getFullYear(),month = this .getMonth();var date = new Date (year,month,1 );document .write("<div class='date'>" +year+"年" +(month+1 )+"月</div>" );document .write("日 一 二 三 四 五 六<br />" );var day = date.getDay();for (var i=0 ;i<day;i++){ document .write(' ' ); } var count = new Date (year,month+1 ,0 ).getDate();for (var i=1 ;i<=count;i++){ document .write(i+' ' ); if ((i+day)%7 ==0 ){ document .write('<br/>' ); } } } new Date (2012 ,2 ).printCalendar();
第十二课时
上节回顾:
1.Date
期类
2.Array
3.Regex
a.[]
一个字符的范围
b.有顺序要求的
c.\w==[a-zA-Z0-9_]
\d==[0-9]
d.{count}
设置匹配数量比如\w{5}
,{c1,c2}
e.//
的正则表达式匹配局部,/^$/
的正则表达式是匹配全部
f.()
的作用就是为了分组匹配
新知识点:
1.Regex
g.+
代表的是1-N
个,*
代表的是0-N
个
h.?
代表该字符要不没有要不就有一个
i..
代表的是任意字符
j. \转义符
2.BOM
第十三课时
上节回顾:
1.Regex
a.[]
一个字符的范围
b.有顺序要求的
c.\w==[a-zA-Z0-9_]
\d==[0-9]
d.{count}
设置匹配数量比如\w{5}
,{c1,c2}
e.//
的正则表达式匹配局部,/^$/
的正则表达式是匹配全部
f.()
的作用就是为了分组匹配
g.+代表的是1-N
个,*
代表的是0-N
个
h.?
代表该字符要不没有要不就有一个
i..
代表的是任意字符
j.\转义符
新知识:
window
是Window
构造器造出来的一个对象 alert(window instanceof Window)
document
是Document
构造器造出来的一个对象
任何对象在我们的内存中他都是由某个构造器创建出来的 也就是说 有构造器一定有对应的原型prototype
例如:div
是由HTMLDivElement
这个构造器创建的一个实例 div = new HTMLDivElement()
span = new HTMLSpanElement()
查看某个对象对应的构造器:console.log();
整个浏览器的实现就是一个面向对象的编程思想 一切皆是对象
1.BOM 浏览器对象模型
BOM
a.screen
指的不是浏览器的宽度,指的是整个电脑屏幕的分辨率
b.navigator
c.location
URL
:统一资源定位符 Union Resource Location
可以通过href
属性重定向(改变)页面的URL,进行页面跳转
d.history
e.frames
f.document
2.DOM
文档对象模型
document
功能
getElementById
$('#aaa')
getElementByTagName
$('div')
getElementsByClassName
$('.aaa')
getElementsByName
只用在表单元素中
document
object
属性:
className
,style
id
name
,value
(表单元素)
href
,src
…(对应的元素)
innerHTML
children
parentNode
功能方法:
setAttribute/getAttribute
appendChild
第十四课时
上节回顾:
1.BOM 浏览器对象模型
a.screen
指的不是浏览器的宽度,指的是整个电脑屏幕的分辨率
b.navigator
c.location
URL
:统一资源定位符 Union Resource Location
可以通过href
属性重定向(改变)页面的URL,进行页面跳转
d.history
e.frames
获得当前窗体的子页面(`iframe`)
f.document
所有的DOM
对象都是在堆内存创建的 都是有一个构造器生成的
查看对象的构造器器方法:
step1:查看标签的对象以及构造器var body = document.body;console.log(body.toString())
step2:查看对象是否是这个构造器创建出来的 console.log(body instanceof HTMLBodyElement)
新知识点:
1.DOM 文档对象模型
document
功能
getElementById
:通过传入的ID,返回标识了这个ID的唯一对象的内存地址
getElementsByTagName
:通过传入的标签名字,返回所有该标签对象(HTMLCollection
)
getElementsByClassName
:通过类的名字,返回所有该类的元素对象(HTMLCollection
)
createElement
:想要创建出来的元素能够绘制在页面中,那么它必须在DOM树中
总结 document
对象是DOM原型的核心对象,它是内存DOM树的根,所以它提供了很多功能让我们快速的找到DOM树中的某些DOM节点(对象)
element
功能方法:(自定义属性非常灵活好用)
setAttribute/getAttribute
//getAttribute获取标签的属性 –用来操作标签的属性
setAttribute
设置标签的属性
appendChild
:添加子元素
属性:
id
className
,style
name
,value
(只有表单元素有 其他是没有的)
href
,src
…(对应的元素)
innerHTML/innerText
innerText
返回文本信息
children
://子元素集合
parentNode
//父元素
总结:元素的功能属性直接可以通过元素对象点
出来,除此意外的自定义属性
,请通过get/setAtribute
去操作
DOM 操作:
图片切换的相册效果
tab
切换效果
表单验证
特效就是DOM
操作的具体应用 DOM
操作就是用js
来写HTML
代码
节点/元素/标签:
操作DOM对象:
修改:–找到这个节点
删除:–找到这个节点
添加:–先造出一个节点 然后插入 插入到哪里?找节点来定位
这些都离不开节点的查找
节点的查找:(最重要)
1、document.getElementById
—根据id
查找节点 [返回的是节点本身]
2、document.getElementsByTagName
–根据标签名字来查找[返回的是数组]document.getElementsByTagName[i]
3、document.getElemenstByName
–根据name
属性来查找节点(一般用在表单中)[返回的是数组]document.getElemenstByName[i]
DOM
中查找节点的思路:(由大到小 个别情况 由子到父)
由大到小:(通过下面的来定位)
1、document.getElementById
—根据id查找节点 [返回的是节点本身]
2、document.getElementsByTagName
–根据标签名字来查找[返回的是数组]document.getElementsByTagName[i]
3、document.getElemenstByName
–根据name
属性来查找节点(一般用在表单中)[返回的是数组]document.getElemenstByName[i]
如果还没有查到自己想要的节点,还可以继续根据上面已经找到的节点再次定位来查找
怎么继续定位?
继续查找:
1、查找子元素 children[index]/childNodes
2、查找父元素 node.parentNode
–>获取父元素
3、查找兄弟元素 nextSibling
previousSibling
4、nextSibling
previousSibling
firstChild
lastChild
这四个属性容易受到空白文本
的影响 建议不用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Object .prototype.next = function ( ) { if (this .nextSibling){ switch (this .nextSibling.nodeType){ case 1 : return this .nextSibling; case 3 : return this .nextSibling.nextSibling; } }else { return null ; } console .log(div1.next().next().innerText);
DOM与节点的关系:
node:
childNodes[]
parentNode
firstChild
getElementsByTagName('元素标签')
lastchild
nextSibling
previousSibling
children[index]
children
不是w3c
标准 但是各大浏览器兼容性很好
1 2 3 4 5 6 7 8 9 10 11 12 HTMLDivElement.prototype.createElement = function (tagName ) { var child = document .createElement(tagName); this .appendChild(child); return child; } var child = document .getElementsByTagName('div' )[2 ].createElement("p" );child.innerHTML = 'pppppp' ;
DOM属性小结
Attributes
存储节点的属性列表(只读)
childNodes
存储节点的子节点列表(只读)
dataType
返回此节点的数据类型
Definition
以DTD
或XML
模式给出的节点的定义(只读)
Doctype
指定文档类型节点(只读)
documentElement
返回文档的根元素(可读写)
firstChild
返回当前节点的第一个子节点(只读)
Implementation
返回XMLDOMImplementation
对象
lastChild
返回当前节点最后一个子节点(只读)
nextSibling
返回当前节点的下一个兄弟节点(只读)
nodeName
返回节点的名字(只读)
nodeType
返回节点的类型(只读)
nodeTypedValue
存储节点值(可读写)
nodeValue
返回节点的文本(可读写)
ownerDocument
返回包含此节点的根文档(只读)
parentNode
返回父节点(只读)
Parsed
返回此节点及其子节点是否已经被解析(只读)
Prefix
返回名称空间前缀(只读)
preserveWhiteSpace
指定是否保留空白(可读写)
previousSibling
返回此节点的前一个兄弟节点(只读)
Text
返回此节点及其后代的文本内容(可读写)
url
返回最近载入的XML文档的URL
(只读)
Xml
返回节点及其后代的XML
表示(只读)
DOM方法小结
cloneNode
返回当前节点的拷贝
createAttribute
创建新的属性
节点操作DOMDocument
属性和方法
createCDATASection
创建包括给定数据的CDATA
段
createComment
创建一个注释节点
createDocumentFragment
创建DocumentFragment
对象
createElement_x_x
创建一个元素节点
createEntityReference
创建EntityReference
对象
createNode
创建给定类型,名字和命名空间的节点
createPorcessingInstruction
创建操作指令节点
createTextNode
创建包括给定数据的文本节点
getElementsByTagName
返回指定名字的元素集合
hasChildNodes
返回当前节点是否有子节点
insertBefore
在指定节点前插入子节点
Load
导入指定位置的XML文档
loadXML
导入指定字符串的XML文档
removeChild
从子结点列表中删除指定的子节点
replaceChild
从子节点列表中替换指定的子节点
Save 把
XML`文件存到指定节点
selectNodes
对节点进行指定的匹配,并返回匹配节点列表
selectSingleNode
对节点进行指定的匹配,并返回第一个匹配节点
transformNode
使用指定的样式表对节点及其后代进行转换
transformNodeToObject
使用指定的样式表将节点及其后代转换为对象
document.documentElement
返回文档的根节点
document.activeElement
返回当前文档中被击活的标签节点
event.fromElement
返回鼠标移出的源节点
event.toElement
返回鼠标移入的源节点
event.srcElement
返回激活事件的源节点
node.parentNode,node.parentElement
返回父节点
node.childNodes
返回子节点集合(包含文本节点及标签节点)
node.children
返回子标签节点集合
node.textNodes
返回子文本节点集合
node.firstChild
返回第一个子节点
node.lastChild
返回最后一个子节点
node.nextSibling
返回同属下一个节点
node.previousSibling
返回同属上一个节点
node.a(oNode)
追加子节点:
node.applyElment(oNode,sWhere)
sWhere
有两个值:outside
/ inside
应用标签节点
node.insertBefore()
node.insertAdjacentElement()
node.replaceAdjacentText()
插入节点
node.remove()
node.removeChild()
node.removeNode()
删除节点
node.replaceChild()
node.replaceNode()
node.swapNode()
替换节点
node.cloneNode(bAll)
返回复制复制节点引用
node.contains()
是否有子节点
node.hasChildNodes()
是否有子节点
第十五课时
上节回顾:
1.DOM 文档对象模型
document
功能
getElementById
:通过传入的ID,返回标识了这个ID的唯一对象的内存地址
getElementsByTagName
:通过传入的标签名字,返回所有该标签对象(HTMLCollection
)
getElementsByClassName
:通过类的名字,返回所有该类的元素对象(HTMLCollection
)
createElement
:想要创建出来的元素能够绘制在页面中,那么它必须在DOM树中
总结: document
对象是DOM原型的核心对象,它是内存DOM树的根,所以它提供了很多功能让我们快速的找到DOM树中的某些DOM节点(对象)
element
功能方法:(自定义属性非常灵活好用)
setAttribute/getAttribute
//getAttribute获取标签的属性 –用来操作标签的属性
setAttribute
设置标签的属性
appendChild
:添加子元素
属性:
id
className
,style
name
,value
(只有表单元素有 其他是没有的)
href
,src
…(对应的元素)
innerHTML/innerText
innerText返回文本信息
children
://子元素集合
parentNode
//父元素
总结:元素的功能属性直接可以通过元素对象点
出来,除此意外的自定义属性
,请通过get/setAtribute
去操作
新知识点:
1.事件(事故)基础
白话含义:就是当一个事物遇到某个事情的时候,要做的事情
2.常用事件
onclick:
当事件源被点击的时候调用处理程序
onmouseover:
鼠标进入事件
onmouseout:
鼠标移出事件
onmousedown:
鼠标按下去的时候
onmouseup:
鼠标抬起来的时候
onscroll:
当事件源滚动条滚动的时候
onkeydown:
当键盘按下的时候
onkeypress:
当键盘按下去的时候
onkeyup:
当键盘弹上来的时候
onfocus:
当事件源获得光标
onblur:
当事件源失去光标
onchange:
当事件源blur
的时候内容改变了的话
浏览器事件注意事项:
1.以后我们不要把事件写在标签上,而使用js
方式操作
2.js方式操作的话:
非IE
浏览器第一个对象就会传入event
事件源对象
IE浏览器第一个对象就不会传入event
事件源对象(event = event||window.event
;)
非IE
浏览器的事件源属性是target
属性(event.target = event.target||event.srcElement
;)
IE
浏6览器的事件源属性是srcElement
属性
3.事件冒泡机制
总结
以上是一些很基础的理论,笔记经验终究是别人的,看完了还是会忘记的,要转化成自己的东西,还要靠你不断实践。
JavaScript读书路线--from phodal
js一些资料推荐
附录一份大神总结的关于js的导图
DOM基本操作
javascript函数基础
JavaScript数据类型
window对象
javascript变量
JavaScript字符串函数
JavaScript正则表达式
JavaScript流程控制
JavaScript运算符
JavaScript数组