JavaScript学习笔记——引用类型:Object类型、function类型

引用类型是一种数据结构,用于将数据和功能组织在一起。
Object类型
创建Object实例的方式有两种,一种是使用new操作符后跟Object构造函数。
var person = new Object();
person.name = "Nicholas";
person.age = 27;

另一种方式是使用对象字面量表示法。

var person = {
    name:Nicholas;
    age:27;
    5:true;//数值属性名会自动转换为字符串
};

一般来说,访问对象属性时使用的都是点表示法,在JavaScript也可以使用方括号表示法来访问对象的属性。

alert(person.name);
alert(person["name"]);
alert(person["name"+i]);

function类型
函数的定义:

funcation sum(num1,num2){
    return num1+num2;
}//方法1
var sum = function(num1,num2){
    return num1+ numm2;
};//方法2

函数是对象,函数名是指针

function sum(num1,num2){
    return num1+ numm2;
}
alert(sum(10,10));

var anothersum = sum;
alert(anothersum(10,10));//20

sum = null;
alert(anothersum(10,10));//20

使用不带圆括号的函数名是访问函数指针,而非调用函数。此时,anothersum和sum同时指向同一个函数,因此anothersum可以被调用并返回结果。即使将sum设置为null,让他与函数断绝关系,仍可以正常调用anothersum。
1、没有重载

function addSomeNum(num){
    return num + 10;}
function addSomeNum(num){
    return num + 20;}//此函数被重写,先前函数体被覆盖
var result = addSomeNum(10);//30

2、函数声明与函数表达式
解析器会率先读取函数声明,并使其在执行任何代码之前可用,至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被执行。

alert(sum(10,10));
function sum(num1,num2){
    return num1+num2;}

代码开始执行前已经读取并将函数声明添加到执行环境中,所以,即使声明函数的代码在调用它的代码之后,也可以正常运行。如果把上述的函数声明改为函数表达式,就会在执行期间发生错误。
3、函数内部属性
在函数内部,有两个特殊的对象:arguements和this。
arguements的主要用途是保存函数参数,这个对象有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguements对象的函数。

var trueFactorial = factorial;

factorial = function(){
            return 0;
};

alert(trueFactorial(5));   //120  递归运算
alert(factorial(5));       //0

另一个特殊对象是this。指向该function的拥有者,如果是全局函数this则指向window对象

window.color = "red";
var o = { color: "blue" };

function sayColor(){
      alert(this.color);
}

sayColor();     //red

o.sayColor = sayColor;
o.sayColor();   //blue

ECMAScript也规范化了另一个函数对象的属性:caller。这个属性中保存着调用当前函数的函数的引用,如果是在全局作用于中调用当前函数,它的值为空。

function outer(){
       inner();
}

function inner(){
     alert(arguments.callee.caller);//调用了outer.toString()
}

outer();//弹出outer的定义的源代码

4、函数属性和方法
外部属性:
1、length:表示函数希望接受的参数的个数
2、prototype:保存着函数的例如valueOf()等函数,只是访问方式是function.valueOf()而已,并且这个属性里的信息是不可以被枚举的
apply()方法
接受两个参数:一个是其中运行的作用于,里一个数参数数组或者arguements对象。

function sum(num1, num2){
            return num1 + num2;
}

function callSum1(num1, num2){
            return sum.apply(this, arguments);//传入arguments对象
}

 function callSum2(num1, num2){
            return sum.apply(this, [num1, num2]);//传入数组
}

alert(callSum1(10,10));   //20
alert(callSum2(10,10));   //20  

call()方法
call方法与apply方法作用相同,区别仅在于接受参数的方式不同,第一个参数是this没有变,变化的是其余的参数都直接传递给函数。

function sum(num1, num2){
    return num1 + num2;
}
function callSum(num1, num2){
    return sum.call(this, num1, num2);
}

alert(callSum(10,10));   //20

apply和call方法的强大之处在于能够扩充函数赖以运行的作用域。

window.color = "red";
var o = { color: "blue" };

function sayColor(){
    alert(this.color);
}

sayColor();            //red

//调用apply方法一样
sayColor.call(this);   //red
sayColor.call(window); //red
sayColor.call(o);      //blue

bind()方法
这个方法会创建一个函数的实例,其this值会被绑定到传给bind函数的值。

window.color = "red";
var o = { color: "blue" };

function sayColor(){
            alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();   //blue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值