1. 程式人生 > >靜態屬性,函數閉包,call/apply,繼承

靜態屬性,函數閉包,call/apply,繼承

javascript public function 關鍵字

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



本文出自 “12897581” 博客,請務必保留此出處http://12907581.blog.51cto.com/12897581/1927119

靜態屬性,函數閉包,call/apply,繼承