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

<!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>

				
时间: 2024-10-25 07:44:33

静态属性,函数闭包,call/apply,继承的相关文章

JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链 JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法 1.Object类 在JS中,Object是所有类的基

java中静态属性和和静态方法的继承问题 以及多态的实质

首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里面定义了静态方法和属性,那么这时候父类的静态方法 或属性称之为“隐藏”,你如果想要调用父类的静态方法和属性,直接通过父类名.方法名或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是 跟实例方法和属性不太一样,存在“隐藏”的这种情况. 多态之所以能够实现是依赖于 继承 接口和 重写 .重

Java静态属性、静态方法、非静态属性、非静态方法的继承问题简单了解

package com.book.web.controller; /**  * 父类  * @author liweihan  *  */ public class Parent { public String normalStr = "父类非静态属性"; public static String staticStr = "父类静态属性"; public String changeStr = "父类-变量"; public static Stri

php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

1.函数     php内置函数可以直接使用,如果没有安装php扩展即可     自定义函数 //函数function 函数名 function dump($var = null){ //支出默认参数值 echo '<pre/>'; var_dump($var); } 2.类(class)和对象( new Obj) <?php //定义一个人的类,现在还不是对象 class Person { //私有属性 private $eye = '大眼睛'; private $mouth = '小

ES6入门六:class的基本语法、继承、私有与静态属性、修饰器

基本语法 继承 私有属性与方法.静态属性与方法 修饰器(Decorator) 一.基本语法 1 class Grammar{ 2 constructor(name,age){ //定义对象自身的方法和属性 3 this.name = name, 4 this.age = age 5 } 6 // 在原型上定义只读属性 7 get inva(){ 8 return "JS"; 9 } 10 //在原型上定义可读写属性 11 set skill(val){ 12 this._skill =

Class的使用,构造方法,实例属性和实例方法,静态属性和静态方法,this和super关键字,类的继承

s6新增了一种定义对象实例的方法,Class(类)这个概念,作为对象的模板.class可以看作只是一个语法糖,通过class关键字,可以定义类.让对象原型的写法更加清晰.更像面向对象编程的语法. 一.  Class的基本用法 1.  constructor方法 1 //定义类 2 class Point { 3 constructor(x, y) { 4 this.x = x; 5 this.y = y; 6 } 7 8 toString() { 9 return '(' + this.x +

JS 实现继承静态属性

在应用中,我们常常设计继承关系,当然静态属性也是很简单的,但是如果把这两者结合到一起,还是需要一些技巧的. 场景描述: 父类:定义静态属性类型,仅仅起到描述的作用,具体的实例化交给每一个子类去做. 定义抽象方法,并且在方法中会调用之前定义的静态属性. 子类:继承父类.子类对静态属性进行赋值. 子类的对象,调用父类的接口. 实现继承代码如下(不是重点): function inherit(sub, sup) {     function F() {}     F.prototype = sup.p

JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程

 壹 ? 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到它,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在自己的理解做个记录,也算是相关知识的一次复习,题目如下,输出过程也直接标出来了: function Foo() { getName = function () { console.log(1); }; return this; }; Foo.getName = function () { cons

php中常量 const属性,静态属性,静态的函数方法

<?php//php中的常量define('MYNUM', 2000);echo MYNUM.'<br>';if(!defined('MYNUM')){ define('MYNUM', 4000);}echo MYNUM;//类内声明及使用class TestConst { const COUNTRY = 'China'; //const不能加public, static也不需要$, 变量名称大写 static $static = 'Static'; public function ge