JavaScript笔记 (原型链闭包)
JavaScript笔记
1.JS在对象实例化过程中会执行构造函数
2.三个常用关键字:
1.constructor 返回对象构造器
2.typeof 返回数据类型
3.instanceof 判断对象是否是某个类的实例
3.对象传递是引用 名字存在堆中(小),属性方法存在栈中(大)
4.function test()
{this.i=10;}
var i=15; //winddow.i=15;
test(); //window.i=10;
alert(this.i); //aler(window.i) 输出结果为 i=10
5.将对象作为参数,将对象作为返回值,都是地址的传递
6.用for in循环对象的属性
for(var i in b)
{
document.write(i+':'+b[i]+'<br>');
}
7.文本下标的数组不计入length
8.delete清除一个对象的属性
9.json是一个属性/属性名 成对出现的对象 是object类的实例
定义一个数组保存多个人信息 var p=[{},{},{}];
10.面向对象时对象实例尽量定义为全局变量,对象方法中有的变量可以定义为对象属性,可以使用数组来存取同一物体的不同属性
11.作用域链和原型链
12.取消事件冒泡用oEvent.cancelBubble=true;
13.IE8一下取消默认事件用 oEvent.returnValue=false;
其他的用oEvent.preventDefault();
统一处理:return false;
14.setTimerout()执行一次 setInterval()反复执行
15.hasOwnProperty('属性') 返回值是布尔,判断对象是否存在某个属性
16.全局变量会一直保留,局部变量运行完后会被回收
17.
在构造器中,this.属性相当于公有属性,外部可以访问
var定义的相当于私有属性,但是执行完对象实例化后,var定义的会被回收,所以要用闭包
于是用this.方法调用var 定义的属性,则实现了闭包,var定义的属性不会被回收
如果该属性只有get方法,说明该属性只读
如果该属性只有set方法,说明该属性只写
18.闭包
function a()
{
var i=10;
this.show=function()
{
alert(i++)
};
}
var b=new a();
b.show(); //11
b.show(); //12
b.show(); //13
b.show();
19.模拟继承的方法:
1.扩展object
Object.prototype.ext=function(parObject)
{
for(var i in parObject)
{
this[i]=parObject[i];
}
};
2.用call 和apply
function b()
{
a.call(this);
this.say=function()
{
alert(this.x+this.y);
}
}
3.原型继承
子类.prototype=new 父类();
20.静态方法和实例方法
静态方法:类可以直接调用
实例方法:方法定义在原型上,需要创建实例再调用
function A()
{
A.sayMeS=function(){
console.log("Hello World S!");
}
A.sayMeS();//输出Hello World S!
实例方法:
function A()
{
A.prototype.sayMeE=function(){
console.log("Hello World E!");
}
var a=new A();
a.sayMeE();//输出Hello World E!
二者的区别:
从定义上,实例方法要用到function这个对象中的prototype属性来定义,静态方法通过A.直接定义;从方法调用上,静态方法可以直接通过A.来调用,实例方法要通过先定义一个引用变量,指向构造函数定义的新对象。
--------------------------------------------------------------------------------------
js遗漏笔记
S中for each只能遍历数组,不能遍历伪数组
foreach(function(value,index){})
;
JS中map也只能遍历数组,不能便利伪数组
arr.map(function(value,index,array){});
任何对象都有属性,只有dom对象才有属性节点
setAttribute设置属性节点的值
getAttrbute获取属性节点的值
改变父元素的透明度但是不改子元素的
用RGB(0,0,0,0.4)
一个元素指定多个 class 时,class 的优先级与指定顺序无关,而是和 class 的定义顺序有关。
将伪数组转换成真数组
如果slice()不传参数,会将数组中的元素放到一个新的数组中返回
var arr=[].slice.call(obj);
将真数组转换成伪数组(将自定义伪数组转换成伪数组还是真数组,都要先利用slice 转换成真数组)
[].push.apply(obj,arr);
document.querySelectorAll(selector)系统根据传入的选择器自动选择
extend 将子类的方法复制到原型里这样可以通过原型调用
for(var key in obj)
{
this[key]=obj[key]
}
获得dom元素的属性节点的值 getAttribute 设置:setAttribute
each里面return true相当于congtinue false相当于break
一般同addEventListener添加事件监听,IE8及一下用attachEvent 同时第一个参数事件要手动加上on
低版本浏览器同一个元素添加的相同事件执行顺序与添加顺序相反,可以用一个对象里面存存着数组来实现顺序调用
例如:catch{click:[test(),test2()],
mouseover:[test3(),test4()]}
原生JS中cloneNode是浅复制,不能复制事件
window.loacation.hash=2 可以种hash值 在url后面加上一个#2
得到hash: console.log(window.location.hash.substring()) // 2