JavaScript编程全解学习日记 一

来源:互联网 发布:淘宝网皮草 编辑:程序博客网 时间:2024/05/01 20:18

第五章 变量与对象

5.1 变量的声明

var a = a || 7 //一种习惯用法,如果变量a有了某个值,(可以被转换为true的值)就直接使用,否则把7赋给a.

5.2 函数的参数(值传递)

function changea,b){    var temp = a;    a = b;    b = temp;}var one = 1;var zero = 0;alert(change(one,zero));  1 0   //变量的值并未改变

5.3 变量与属性

在js中,变量就是属性。变量可以分为全局和局部变量。全局变量是全局对象的属性。

var x = "foo";alert(this.x);     //通过this.x 进行访问foo    

最外层代码中this是对全局对象的引用。可以将this赋值给全局变量global。

var global = this; //global既是全局对象的属性,也是全局对象的引用。

局部变量:是在函数调用时被隐式生成的对象(称为call对象)的引用。

5.14 this引用

※ 在最外层代码中,this引用的是全局对象。
※ 在函数内部,this引用根据函数调用的方式不同而不同。


函数的调用方式 ———————————— > this引用的对象
构造函数调用——————————————>所生成的对象
方法调用 ————————————————>接受放对象

var obj = { x:3,doit:function (){ aleret(this.x)}}fn = obj.doit;      //将obj.doit引用的function对象赋给全局变量fn();                       //  函数内this指向全局对象method is called . undefined  

apply 或call调用—————————————> 有apply或call参数指定的对象

在Function对象中包含apply和call两个方法。它们可以显示的指定接受方对象。

function f (){ alert(this.x)}var obj = {x:4};f.apply(obj);       //通过apply调用函数f,函数内部的this指向obj对象4f.call(obj);            //同样4

apply和call的区别是对于其他参数的传递方式,apply的剩余参数通过数组传递。call直接按原样传递。

function f (a,b){alert(a +b)}f.apply(obj,[1,2])f.call(obj,1,2)

在实际中,我们通常为了函数回调而使用apply和call
其他方式调用———————————————> 全局对象


5.16 原型链

※ 所有的函数(对象)都具有prototype的属性
※ 所有的对象都含有一个隐形链接,指向在对象生成过程中所使用的构造函数(Function对象)的prototype对象。
所有的对象最终都会具有一个Object.prototype对象的隐式链接。
注意:

function MyClass(){}var obj = new MyClass();

MyClass.prototype所引用的对象是obj的原型对象。并不是MyClass的原型对象。Function.prototype引用的对象才是MyClass的原型对象。

5.17 对象与数据类型

数据类型判定(constructor属性)

通过对象的constructor属性来从对象处获取其构造函数。

var d = new Date();alert(d.constructor)function Date(){    [native code]}

注意:constructor属性不是对象的直接属性,而是通过原型链查找到的属性。

function Derived(){};       //派生类function Base(){};          //基类Derived.prototype = new Base();var obj = new Derived();alert(obj.constructor)function Base(){}

与obj.constructor的原型链相连的实体是Derived.protorype.constructor.
数据类型判定(instanceof运算)

var d = new Date();alert(d instanceof Date)true

属性的枚举
for in 来枚举属性,都会对原型链进行搜索。若要对直接属性判断时可以用hasOwnProperty方法

forvar name in obj){    if(obj.hasOwnProperty(name)){        alert(name)   // 直接属性   }}
0 0