<!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><</code><code>br</code><code>></code>
<code></code>
本文轉自 沉迷學習中 51CTO部落格,原文連結:http://blog.51cto.com/12907581/1927119,如需轉載請自行聯系原作者