靜態屬性,函數閉包,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>
本文出自 “12897581” 博客,請務必保留此出處http://12907581.blog.51cto.com/12897581/1927119
靜態屬性,函數閉包,call/apply,繼承