JS之面向对象

 函数在js中是非常重要的一个概念,当使用js定义一个函数时,实际上得到的如下五项:

1.函数:就像java方法一样可以被调用。

2.对象:定义一个函数时,系统也会创建一个对象,该对象时function的实例。

3.方法:定义一个函数时,该函数通常都会附加给某个对象,作为该对象的方法。

4.变量:在定义函数的同时,也会的到一个变量。

5.类:在定义函数的同时,也会得到一个与函数同名的类。

 

函数不仅可以作为函数使用,它本身也时一个对象,是Function的实例。如下:

var f = function(){
  console.log(aa);
};
console.log(f instanceof Function);

结果:

true

可以看到在创建function 的时候也创建了一个function的实例,并将function实例赋值给f;

 

js的函数不仅仅是一个函数,更是一个类,在定义一个js的函数时,也会的到一个与该函数名相同的类,该函数也是该类唯一的构造器。

所以函数在调用的时候有两种方法

一:直接调用;直接调用返回该函数体内最后一个return语句的返回值;如果函数体内没有返回值,则返回值为空。

二:通过“new”关键字来调用;返回的是一个js对象。

var f = function(name){
  return "你好"+name;
};
var demo1 =f("骚小孩");
var demo2 = new f("小明");
console.log(demo1);
console.log(demo2);

结果:

你好骚小孩
f {}

可以看到第一demo1(直接调用)返回的是一个字符串,然后通过new关键字来调用返回的是一个f{}对象。

 

为js对象添加属性和方法

我们可以通过在函数nei使用this.属性名=属性值;为js对象添加属性或方法。

var f = function(name,age){
    this.name=name;
    this.age=age;
    this.introduce=function(){
        console.log(this.name);
        console.log(this.age);
    }
};
var demo2 = new f("小明","11");
demo2.introduce();

结果:

小明
11

被this关键字修饰的变量不再是局部变量,他是函数的实例属性。

 

js的函数可以附加到某个对象上的,如果没有指定将函数加到那个对象上,那么就会附加到window上。

function say(word){
    console.log("say "+word);
}
window.say("aaa");

结果:

say aaa

 

函数在定义的时候也会产生也会引入一个变量,该变量名与函数名相同,所以尽量避免函数名与变量名重复。

function say(word){
    console.log("say "+word);
}
say("aaa");
say="nihao";
say("bb");

结果:

say aaa
报错

 

上面说了函数不仅仅是一个对象还是一个类,那么在这个类中有:

1:局部变量;通过var 来声明;

2:实例属性:通过this前缀修饰;

3:类属性:通过函数名前缀修饰;

局部变量只能在函数中使用,实例属性是单个对象的属性,通过对象来访问,类属性属于整个类的,通过类来访问。

var f = function(name,age,country){
    this.name=name;
    this.age=age;
    f.country=country;
    this.introduce=function(){
        console.log(this.name);
        console.log(this.age);
        console.log(this.country);
    }
};
var per = new f("小名",20,"中国");
per.introduce();
console.log(f.country);

结果:

小明
20
undefined
中国

可以看出,只有通过正确的方法才能正确访问到对应的属性。

同一个类(函数)只占用一块内存,因此每个类属性都在同一块内存;同一个类每创建一个对象,系统将为该对象的实例属性分配一块内存。

 

js与java不同,他是一个动态语言,他允许随时为对象增加属性和方法,当直接为对象某个属性赋值时,即为对象增加属性。

var f = function(name,age){
    this.name=name;
    this.age=age;

};
var per = new f("小明",20,);
per.country="china";
per.intro=function(){
    with(console){
        log(per.name);
        log(per.age);
        log(per.country);
    }
};
per.intro();

结果:

小明
20
china

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值