博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态属性,函数闭包,call/apply,继承
阅读量:6272 次
发布时间:2019-06-22

本文共 4083 字,大约阅读时间需要 13 分钟。

<!doctype html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>静态属性,函数闭包,call/apply,继承</title>

<script type="text/javascript">

/* 一:静态属性

在一些面向对象语言里,可以使用static关键字来显示的定义属性和方法。这一点javascript可以模拟。但实际在javascript没有这个概念。

*

java:

 所有实例对象公共的属性/方法可以使用静态。

通过 类.属性/方法 调用的叫做类变量/静态变量。非静态不能调用静态---->初始化问题。

class Person{

public static String name;

public static int    age;

public static void eat(){

system.out.print(name+"正在吃饭");

}

}

js语法:

类名.属性

类名.属性=function(){};

function Person(){

   Person.count++;  //静态属性

}

Person.count=0;

Person.getCount=function(){

alert("共有:"+Person.count+"人"); //静态方法

}

var p1  = new Person();

var p2  = new Person();

var p3  = new Person();

Person.getCount();

alert(p1.count);

二:函数闭包

 概念:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

 功能:

  1):访问局部变量。

  2):使变量所占的内存不被释放。

function fn1(){

var i=10;

function fn2(){

alert(i++);

}

return fn2;

}

var text = fn1();

text();

text();

text();

text();

text();

三:私有属性

java:用private关键字定义私有属性,只能通过方法来访问成员变量。

class Person{

private Stirng name;

private int    age;

public void setName(String name){

this.name = name;

}

public String getName(){

return  name;

}

}

js:对于有些敏感的,不想公开的成员可以定义为私有,在javascript中可以模拟这个功能(本身没有这个概念)

语法:

function Person(p_name){

var name = p_name;

}

//可以这样理解,类中。

var :私有;

this:公有;

function Person(p_name,p_age){

this.name = p_name;

var age;

}

var p1 = new Person("张三");

//有问题,用var来表示私有成员属性,但Person构造函数执行完毕后,age会被回收,不能当做成员属性来使用。????----->用函数闭包吗?

//通过  set get。

function Person(p_name){

this.name = p_name;

var age;

//可写操作

this .setAge = function(p_age){

age  = p_age; //这两个名字不能一样,会有问题。--->就变成了setAge中的一个局部变量了,不能影响到上一级的age,

  它会被回收。

}

//可读操作

this.getAge = function(){

return age;  

}

//因为setAge和getAge两个方法是全局的且使用到了age属性,所以age属性不会被回收。

}

var p1 = new Person("张三",18);

p1.setAge(20);

alert(p1.getAge());

四:call,apply的使用:

1:使用指定的对象调用当前函数

语法:

    call([thisObj[,arg1[,arg2[,argN]]]]);

     参数一:函数执行时,this指向谁.

     参数二:后面的参数,根据需要顺序指定.

    apply([thisObj[,argArray]]);

     参数一:函数执行时,this指向谁.

     参数二:数组,表示参数集合.

2:在js中,函数调用的几种方式!

 Person();------------this------------》Window对象

 var p1 = new Person()----this--------》p1对象

 per.person();-----------this-------------》per对象

 js中内部的this会随着程序的运行指向不同的对象,那么,我们能不能手动修改这个this的指向呢?------------->call(),apply();

function Person(name,age){

this.name = name;

this.age  = age;

}

function speak(){

return this+name+":"+this.age;

}

var p1 = new person("张三",18);

//speak();--------->this是window.

//p1.speak();--------->p1---->原型对象---->Object-->没有speak()方法

//p1.say=speak;------>动态添加了一个方法,增加了对象的内存空间。

alert(speak.call(p1));

alert(speak.apply(p1));

call()和apply()在执行时做了两件事!(重点)

1:将函数内部this指向了第一个参数对象.

2:调用函数.

五:继承的实现;

java:用extends关键字,子类继承父类的属性和方法.(只能单继承)

class son extends parent{

}

js:在javascript中可以模拟这个功能(本身没有这个概念);

1:扩展object方法.(不推荐)

语法:

Object.prototype.love=function(parObject){

//循环遍历父类对象所有属性

for(var i in parObject){

//为子类对象添加遍历到的属性.

//它的值是父类对象这个属性的属性值

this[i] =parObject[i];

}

}

Object.prototype.love=function(parObject){

for(var i in parObject){

this[i] =parObject[i];

}

}

function Person(name,age){

this.name = name;

this.age  = age;

this.speak = function(){

return this.name +":"+this.age;

}

}

function Student(id){

this.id = id;

this.stud= function(){

return this.id+this.name+this.age;

}

}

var son = new Student(101);

son.love(new Person("张三",18));

console.log(son);

console.log(son.stud());

2:使用call,apply方法.

 语法:

  父类构造器.call(this,...);

function Person(name,age){

this.name = name;

this.age  = age;

this.speak= function(){

return this.age+this.name;

}

}

function Student(id,name,age){

this.id = id;

Person.call(this,name,age);

this.stud = function(){

return this.name+this.age+this.id;

}

}

var s = new Student(101,"张三",18);

console.log(s.stud());

3:原型继承.(推荐使用)

function Person(name,age){

this.name = name;

this.age  = age;

this.speak= function(){

return this.age+this.name;

}

}

function Student(id){

this.id = id;

this.stud = function(){

return this.name+""+this.age+this.id;

}

}

Student.prototype = new Person("张三",18);

var s = new Student(101);

var s2 = new Student(102);

console.log(s.name);

*/

</script>

</head>

<body>

</body>

</html>

1
<
br
>
本文转自 沉迷学习中 51CTO博客,原文链接:http://blog.51cto.com/12907581/1927119,如需转载请自行联系原作者
你可能感兴趣的文章
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
多线程基础知识
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>