天天看點

靜态屬性,函數閉包,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();

三:私有屬性

java:用private關鍵字定義私有屬性,隻能通過方法來通路成員變量。

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。

//可寫操作

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.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];

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,...);

this.speak= function(){

return this.age+this.name;

function Student(id,name,age){

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:原型繼承.(推薦使用)

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>

<code>&lt;</code><code>br</code><code>&gt;</code>

<code></code>

本文轉自 沉迷學習中 51CTO部落格,原文連結:http://blog.51cto.com/12907581/1927119,如需轉載請自行聯系原作者