js面對物件程式設計 二 屬性和閉包

2022-09-19 01:33:08 字數 3403 閱讀 9734

上篇部落格中解說了一些js物件的基本概念和使用方法。這篇部落格解說一下js屬性方面的:公有屬性。私有屬性,特權方法。

假設學過j**a。公有屬性。私有屬性,特權方法(即能夠訪問和設定私有屬性的方法)一定非常熟悉。那麼讓我們來看看在js裡怎樣實現呢?

function person(name,age)

this.getage=function()

}var josh=new person('josh','25')

console.log(josh.name); //josh

console.log(josh.getname()); //josh

我們在這裡定義了乙個叫josh的person物件,讓我們通過new方法再建立2個其它person物件

var eric=new person('eric','25');

var mongo=new person('mongo','23');

console.log(eric.name); //eric

console.log(mongo.name); //monge

這裡我們每次new乙個物件的時候。person中全部的**都會複製乙份,便造成了記憶體的浪費。能夠通過定義同一類物件共同擁有的方法來解決問題。因此在這裡須要prototypekeyword來我們。

從字面上來看。prototype能夠理解為"property to type",即型別的屬性。對於一類的屬性。拿上面定義的person來說。即對person這一類物件共同擁有的方法或屬性。我們改造一下上面的**

function person(name,age)

person.prototype.getname=function()

person.prototype.getage=function()

var josh=new person('josh','25')

var eric=new person('eric','25');

var mongo=new person('mongo','23');

console.log(josh.getname()); //josh

console.log(eric.name); //eric

console.log(mongo.name); //monge

因此公有方法或屬性,也能夠理解為通過建構函式的prototype加入的方法或屬性,這裡的建構函式即person。由於js中不存在類的概念,所以我們通過建構函式來建立新的物件,而通過prototype定義的屬性方法。為這一類所共享,像極了j**a中類裡的靜態方法或屬性為一類所共享。

基於面對物件的封裝特性。我們並不想把全部變數都公開給外界,於是拿上面的person物件來說,我們把屬性定義中的this.name被換成了var name。於是能夠被外界訪問的公有屬性就變成了私有屬性,對於屬性的訪問結果也變成了undefined

function person(name,age)

var josh=new person('josh','25')

var eric=new person('eric','25');

var mongo=new person('mongo','23');

console.log(josh.name); //undefined

console.log(eric.name); //undefined

console.log(mongo.name); //undefined

為什麼this.name被換成了var name,物件屬性就由公有變私有了呢?首先看thiskeyword。this表示當前屬性所存在的物件:

function person(name,age)
上面這段**換成了以下這段,您就能夠看明確了,即首先定義乙個person空建構函式,然後定義person物件,再依據person動態增減屬性的特性新增name和age屬性

function person()

var person=new person();

person.name='josh';

person.age='25';

那麼換成var name的私有屬性又是怎樣實現的呢?這裡就要設計js面對物件的幾個重要基礎概念了,各自是 作用域,上下文,閉包。

首先說作用域。大家假設接觸過一門程式語言就應該有了解,作用域是當前定義的變數能夠再什麼樣的範圍內被引用。拿大家比較比較熟悉的j**a來說。j**a是塊級的,在if、while這些塊中定義的。僅僅能在塊裡用。出了塊就不行了;假設想範圍大一些。能夠在方法的開始定義,供整個方法是用。但在方法外不能被是用;也能夠定義類級的,在整個類內都能引用。

在js中,作用域是函式級的。也就是在函式內定義的變數。在函式外不可引用,函式起到了界定作用域的作用。上文的這個樣例中,對於josh.name屬性的訪問就變成了undefined。

function person(name,age)

var josh=new person('josh','25');

console.log(josh.name); //undefined

接下來解釋上下文。上下文表明了函式或者物件處在的環境,這個環境中包括了一些變數。物件或者函式。結合作用域的概念一起看一張圖

對著這張圖來說,person物件能夠訪問上下文中的變數,物件或者是函式,而上下文中的變數不能訪問person物件的name屬性。由於name屬性的作用域是侷限在person物件內的,也就是外層對內層開放,內層對外層關閉。

那麼由此就衍生出了閉包的概念,閉包就是乙個封閉的包,能拒絕外層的訪問,上圖person物件就是乙個閉包,包外不能訪問包內私有的變數,僅僅能通過某些特殊方式(特權方法)來訪問。接下來介紹下特權方法。

特權方法相當於j**a類中對私有變數提供訪問和設定的get/set方法

function person()

this.getage=function()

this.setname=function(name)

this.setage=function(age)

}var josh=new person();

josh.setname('josh');

josh.setage('25');

console.log(josh.getname());

console.log(josh.getage());

到此。共同擁有屬性,私有屬性,閉包的概念就講完了,本篇部落格用非常小的篇幅將了閉包這個概念,但卻說明了閉包最根本的實質,函式所處的上下文沒有權利訪問函式內定義的變數。於是就形成了閉包(乙個封閉的包)。大家有了這個概念,再看閉包的文章,一定會非常受用。

第二章 MATLAB面對物件程式設計入門

a 7 b c rand 4 4 whos name size bytes class attributes a 1x1 8 double b 1x5 10 char c 4x4 128 double classdef point2d handle properties 屬性 block 開始 en...

理解閉包 js物件導向程式設計

先看一段 function a inc inc a 控制台輸出1,再輸出2 簡單吧。再來看一段 function a var c new a c.inc 控制台輸出1 c.inc 控制台輸出2 簡單吧。什麼是閉包?這就是閉包!有權訪問另乙個函式作用域內變數的函式都是閉包。這裡 inc 函式訪問了建構...

初學js的物件導向程式設計與閉包

下面利用閉包特性來封裝乙個物件student,運用物件student儲存乙個學生的資訊,資訊包括姓名,性別和年齡,這些資訊不可被外部直接訪問,只能通過物件的方法獲取 1建立乙個建構函式student,student中使用字面式定義乙個空物件privatestore,用來存放私有的資料。2.stude...