日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态属性,函数闭包,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>



轉載于:https://blog.51cto.com/12907581/1927119

總結

以上是生活随笔為你收集整理的静态属性,函数闭包,call/apply,继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。