- 作用域、嵌套函數和閉包
- 真正的私有方法和屬性:在Javascript中,隻有函數才有作用域 。也就是說,在一個函數内部聲明的變量在函數外問無法通路。但是定義在這個函數中的變量可以被内嵌在這個函數中的内嵌函數 。是以這樣就可以達到私有方法和屬性的效果.
function foo() { var i = 2; // private function function bar() { i *= 2; } bar(); return i; } 以及 function foo() { var i = 2; // private function function bar() { i *= 2; return i; } return bar(); } var baz = foo(); // baz is now a reference to function bar. baz(); // returns 4 baz(); // returns 8 baz(); // returns 16 var blat = foo(); // blat is another reference to bar. blat(); // return 4
- 真正的私有方法和屬性:在Javascript中,隻有函數才有作用域 。也就是說,在一個函數内部聲明的變量在函數外問無法通路。但是定義在這個函數中的變量可以被内嵌在這個函數中的内嵌函數 。是以這樣就可以達到私有方法和屬性的效果.
- 什麼時候應該在構造函數裡定義方法(特權方法Privileged methods):
什麼時候應該用prototype方式定義方法:var Persion = function(name, age) { var name; this.setName(nameParam) { name = nameParam; } }
prototype定義的方法沒法通路到私有變量和方法, 而且prototype定義的方法在記憶體中隻存在一份,而特權方法Privileged methods會在建立多個執行個體後在記憶體中存在多份,進而會降低性能。另外私有屬性和方法不能被子類重用,是以當要在子類重用方法或屬性時,對方法和屬性的作用域限制就不能用閉包來實作了。var Person = function(name, age) { var name; var age; this.getName() { return name; } this.getAge() { return age; } }; Person.prototype = function() { toString : function() { return this.getName() + " is " + this.getAge() + " years old." } }
- 一個完整的JS類的例子(采閉包方式實作)
var Person = (function(){ // const variable(This variable won't be changed, so it's final.) var EIGHTEEN = 18; // private static variable var personCount = 0; // private static method function isAdult(age) { return age >= EIGHTEEN ? true : false; } // constructor return function(nameParam, ageParam) { // private instance variable var name, age; // public instance method(Privileged method) this.setName = function(nameParam) { name = nameParam; }; this.getName = function() { return name; }; this.setAge = function(ageParam) { if (isAdult(ageParam)) { age = ageParam; } age = EIGHTEEN; }; this.getAge = function() { return age; }; // init properties or do some about initializing work personCount++; this.setName(nameParam); this.setAge(ageParam); } })(); // public static method for Person class Person.doSomething = function() { //TODO...... }; // Create Person instance Person handy_wang = new Person("handy.wang", 18); handy_wang.setName("Wang-Jiangshan"); handy_wang.setAge(24); Person.doSomething();