摘要:私有變量任何在函數中定義的變量,都可以認為是私有變量,因為在不能再函數的外部訪問這些變量。我們把有權訪問私有變量和私有函數的公有方法稱為特權方法。模塊模式模塊模式是為單例創建私有變量和特權方法。
私有變量
任何在函數中定義的變量,都可以認為是私有變量,因為在不能再函數的外部訪問這些變量。私有變量包括函數的參數、函數中定義的變量和函數。我們把有權訪問私有變量和私有函數的公有方法稱為特權方法。
function MyObject(number){ // 私有變量和私有函數,number也是私有變量 var privateVariable = 10 function privateFunction(){ return false } // 特權方法 this.publicMethod = function(){ number++ privateVariable++ return privateFunction() } } var myobject = new MyObject()
在創建MyObject的實例后,除了使用publicMethod這一個途徑外,沒有任何辦法可以直接訪問privateVariable和privateFunction以及number,利用私有和特權成員,可以隱藏哪些不應該被直接修改的數據。
靜態私有變量(function(){ var name = "" var privateVariable = 10 function privateFunction(){ return false } // 沒有在聲明Person時使用var關鍵字,則會創建一個全局變量 Person = function(value){ name = value } Person.prototype.getName = function(){ return name } Person.prototype.setName = function(value){ name = value } })() var person1 = new Person("Nicholas") alert(person1.getName()) // "Nicholas" person1.setName("Greg") alert(person1.getName()) // "Greg" var person2 = new Person("Michael") alert(person1.getName()) // "Michael" // 私有變量和私有函數是由所有實例共享的 alert(person2.getName()) // "Michael"
這個模式與在構造函數中定義特權方法的主要區別,就在于私有變量和私有函數是由所有實例共享的。由于特權方法是在原型上定義的,因此所有實例都使用同一個特權方法。而這個特權方法,作為一個閉包,總是保存著對包含作用域的引用。
模塊模式模塊模式(module pattern)是為單例創建私有變量和特權方法。所謂單例,指的就是只有一個實例的對象。按照慣例,使用對象字面量的方式來創建單例對象.
var module = function(){ var privateVariable = 10 function privateFunction(){ return false } return { publicProperty: true, publicMethod: function(){ privateVariable++ return privateFunction() } } }
如果必須創建一個對象并以某些數據進行初始化,同時還要公開一些能夠訪問這些私有數據的方法,那么就可以使用模塊模式。
var application = function(){ var components = new Array() components.push(new BaseComponent()) return { getComponentCount: function(){ return components.length }, registerComponent: function(component){ if(typeof component === "object"){ components.push(component) } } } }()增強的模塊模式
增強的模塊模式適合那些單例必須是某種類型的實例,同時還必須添加某些屬性和方法對其加以增強的情況.
var application = function(){ var components = new Array() components.push(new BaseComponent()) // 單例必須是某種類型的實例 var app = new ComponentList() app.getComponentCount = function(){ return components.length } app.registerComponent = function(component){ if(typeof component === "object"){ components.push(component) } } return app }()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/83382.html
摘要:這種方法也存在這樣的問題如果修改了構造函數的原型對象,之前創建的對象無法通過這種方式來確定類型修改構造函數的原型對象會導致之前創建的對象無法通過這種方式判斷類型判斷對象繼承自哪些父類型使用使用 判斷對象類型的方法 使用原型對象上的constructor屬性來判斷 每個對象的原型上都有一個constructor屬性,指向了其構造函數 注意:對象沒有constructor屬性(除非自己添加...
摘要:繼承原型鏈原型鏈是實現繼承的主要方法。臨時的構造函數將傳入的對象作為這個構造函數的原型返回新實例以為原型創建一個新實例不僅屬于所有,而且也會被共享。上訴例子只調用了一次構造函數,因此避免了在上面創建不必要的多余的屬性。 繼承 1 原型鏈 原型鏈是實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。 構造函數、原型和實例的關系 每個構造函數都有一個原型對...
摘要:原型對象的問題省略了為構造函數傳遞參數,導致了所有實例在默認情況下都取得相同的屬性值。即使有其他代碼會給這個對象添加方法或數據成員,但也不可能有別的方法訪問傳入到構造函數中的原始數據。 創建對象 1.Object構造函數 創建一個Object的實例,然為其添加屬性和方法(早期創建對象的模式) var person = new Object(); person.name = Nichol...
摘要:首先導包依賴如下構建應用是以為中心的實例可以通過獲得其中是工廠接口任務用于創建配置文件將會解析配置文件在類對象中配置獲取數據源事務管理器映射器在文件下新建文件配置文件內容如下定義別名定義數據庫信息事物管理 首先導包 依賴如下 mysql mysql-connector-java 8.0.15 org.m...
閱讀 981·2021-11-24 09:39
閱讀 2739·2021-09-26 09:55
閱讀 14713·2021-08-23 09:47
閱讀 3595·2019-08-30 15:52
閱讀 863·2019-08-29 13:49
閱讀 1016·2019-08-23 18:00
閱讀 859·2019-08-23 16:42
閱讀 1656·2019-08-23 14:28