第五章 变量与对象
5.1 变量的声明
var a = a || 7 //一种习惯用法,如果变量a有了某个值,(可以被转换为true的值)就直接使用,否则把7赋给a
.
5.2 函数的参数(值传递)
function change (a,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对象
4
f.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方法
for(var name in obj){
if(obj.hasOwnProperty(name)){
alert(name) // 直接属性
}
}