javascript之面向对象学习笔记03

时间:2023-01-02 11:19:01

实例成员静态成员

实例成员:由构造函数创建的对象的成员。

静态成员:构造函数的成员

 

一般在使用的时候, 将通用的方法由静态成员提供, 实例成员如果要实现该功能, 调用静态成员来实现

 

 

构造函数的部分属性

1name

语法:函数名.name

作用:返回构造函数名字

function f (){}

console.log(f.name)
// f

 

 

2、length

语法:函数名.length

作用:返回构造函数参数列表形参的个数,arguments.length获得调用方法时实参的个数

 

function f (a,b,c){

console.log(arguments.length)

}

console.log(f.length)
// 3

f(
1,2); //2

 

3、caller

语法:函数名.caller

作用:返回调用该函数的函数,已被废除

 

function foo () {

console.log( foo.caller );

}

foo();
//无函数在调用foo,打印null

function f () {

foo();

}

f();
//在函数f内调用foo,打印函数f

 

递归

所谓递归就是自己调用自己。

 

function f(){

f();

}

f();
//死递归导致报错



arguments.callee 指向当前函数

function f(){

arguments.callee();

}

f();
//死递归导致报错

 

 

闭包

在函数内部允许访问外部的变量, 但是反之不允许

 

function fn (){

var a = 0;

return function (){

return a;

};

}

 

此时便可访问到fn函数内部的变量

 

获得闭包内多个变量,可以返回对象实现

function fn (){

var a = 0;

var b = 1;

return {

getA :
function(){ return a; }

getB :
function(){ return b; }

};

}

var f = fn();

console.log(f.getA());
//0

console.log(f.getB());
//1

 

 

沙箱模式

js , 只有函数可以限定变量的作用域,自然只有函数可以实现隔离。

 

(function(){

//.......

})()

 

 

在该自调用函数中,所有定义的变量只在函数内生效,避免污染全局变量。如果需要使用沙箱内的变量可移动过挂在window的方式提供访问接口。

 

(function(){

var a = 10;

var b = 20;

window.a
= a;

})()

console.log(a);
//10

console.log(b);
//报错

 

 

函数的调用模式

1、函数模式

直接调用方法,属于函数模式,this指向window对象

function fn(){

console.log(
this);

}

fn();
//Window

 

 

2、方法模式

函数属于某个对象的属性,使用对象.函数调用属于方法模式,this指向调用的对象

var o = {

fn :
function(){

console.log(
this);

}

};

o.fn();
//o

 

 

3、构造器模式

使用new来调用函数,this指向实例化出来的对象

 

function Fn(){

this.n = 1;

}

var f = new Fn();

console.log(f.n);
//1

 

 

需要注意的是使用new来调用函数时return返回基本类型时忽略,返回对象时函数的返回值是return的对象。

 

function Fn1(){

this.n = 1;

return 2;//返回基本类型

}

var f1 = new Fn1();

console.log(f1.n);
//1 f1无影响


function Fn2(){

this.n = 1;

return {n:2};//返回对象

}

var f2 = new Fn2();

console.log(f2.n);
//2 f2为返回的对象

 

 

4、上下文模式

使用函数.apply或者函数.cell方法调用,apply方法和call方法实现的功能相同,仅仅参数不同。apply方法第一个参数为上下文对象,第二个参数若有则为数组,内容为方法的参数列表。call第一个参数和apply相同,之后的参数为函数的参数列表

function fn(a,b){

console.log(
this+"-----"+a+"------"+b);

}

var obj = {n:1};

var arr = [2];

fn.apply(obj,[
1,2]); //[object Object]-----1------2

fn.call(arr,
1,2); //2-----1------2