posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JavaScript 學習 - Object Basics

          Posted on 2007-05-04 23:06 ZelluX 閱讀(457) 評論(0)  編輯  收藏 所屬分類: Web
          1. 面向對象語言的四個要素:封裝、聚合(Aggregation)、繼承、多態。
          ps. Aggragation - the capability to store one object inside of another object
          (貌似這本書并沒有區分Object-based和Object-oriented)

          2. 創建對象
          基本和Java一樣,但對于無參構造器,也可以使用類似Delphi的沒有括號的語法。
          var oStringObject = new String;

          3. ECMAScript也有垃圾收集機制,不過早期版本的瀏覽器不支持。

          4. 由于弱類型機制,ECMAScript不支持早期綁定,因此對象的方法和屬性可以在運行期定義。

          5. ECMA-262定義的基礎類:
          Object, Function, Array, String, Boolean, Number, Date, RegExp, Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError

          6. String類的方法:
          join, split, concat, slice, push(), pop(), shift(), unshift(), reverse(), sort() 方法略,還有個貌似挺麻煩的splice方法。

          7. Data類
          翻了下,發現顯示當前時間只要new Date().toLocaleTimeString()就行了,寫Project2時土了

          8. Global類
          因為在JavaScript中并沒有單獨存在的函數,所有的函數都必須是已經存在的對象所屬的函數。
          于是有了Global類,包含所有“獨立”函數的類。
          貌似Global類的函數比較有用
          a)
          var sUri = “http://www.wrox.com/illegal value.htm#start”;
          alert(encodeURI(sUri));
          alert(encodeURIComponent(sUri));
          輸出:
          http://www.wrox.com/illegal%20value.htm#start
          http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start
          區別在于encodeURI不處理屬于URI的特殊字符,如;/?:;而encodeURIComponents處理所有特殊字符。
          相應的有decodeURI和decodeURIComponents方法。
          b)
          eval 方法
          很強大,但要小心使用,容易被注入惡意代碼。

          9. Math 類
          用的時候再查API吧。。。

          10. 作用域
          a) JavaScript 所有的元素都是public的。無疑這會增加編程的難度,于是有了一種約定,即用兩個下劃線修飾命名“私有”變量。如
          obj.__color__= "red";
          就表示color是obj的一個私有變量(注意這只是一個約定,意味著其他程序員不應該使用這個變量)
          也有寫成obj._color的。
          b) JavaScript 也沒有嚴格意義上的static域。
          function sayHi() {
             alert(“hi”);
          }


          sayHi.alternate 
          = function() {
             alert(“hola”);
          }
          ;

          sayHi(); 
          //outputs “hi”
          sayHi.alternate(); //outputs “hola”
          這里,alternate實際上是函數sayHi的一個方法。

          11. 還是創建對象
          由于JavaScript并沒有提供真正意義上的構造方法,開發者們使用了不同的模式創建對象(怎么老覺得JavaScript這個語言是開發者在不斷適應它,而不是它不斷適應開發者呢 -,-)
          a) Factory
          function createCar(sColor, iDoors, iMpg) {
              
          var oTempCar = new Object;
              oTempCar.color 
          = sColor;
              oTempCar.doors 
          = iDoors;
              oTempCar.mpg 
          = iMpg;
              oTempCar.showColor 
          = function () {
                  alert(
          this.color)
              }
          ;
              
          return oTempCar;
          }


          var oCar1 = createCar(“red”, 423);
          var oCar1 = createCar(“blue”, 325);
          oCar1.showColor(); 
          //outputs “red”
          oCar2.showColor(); //outputs “blue”
          另外也可以把showColor這個方法在外部聲明,然后使用oTempCar.showColor = showColor;
          b) Constructor
          function Car(sColor, iDoors, iMpg) {
              
          this.color = sColor;
              
          this.doors = iDoors;
              
          this.mpg = iMpg;
              
          this.showColor = function () {
                  alert(
          this.color)
              }
          ;
          }


          var oCar1 = new Car(“red”, 423);
          var oCar2 = new Car(“blue”, 325);
          c) Protopype
          function Car() {
          }


          Car.prototype.color 
          = “red”;
          Car.prototype.doors 
          = 4;
          Car.prototype.mpg 
          = 23;
          Car.prototype.showColor 
          = function () {
              alert(
          this.color);
          }
          ;

          var oCar1 = new Car();
          var oCar2 = new Car();
          這種模式的好處在于,允許instanceof操作符進行類型判斷。但也有缺陷,例如
          function Car() {
          }


          Car.prototype.color 
          = “red”;
          Car.prototype.doors 
          = 4;
          Car.prototype.mpg 
          = 23;
          Car.prototype.drivers 
          = new Array(“Mike”, “Sue”);
          Car.prototype.showColor 
          = function () {
              alert(
          this.color);
          }
          ;

          var oCar1 = new Car();
          var oCar2 = new Car();
          oCar1.drivers.push(“Matt”);
          alert(oCar1.drivers); 
          //outputs “Mike,Sue,Matt”
          alert(oCar2.drivers); //outputs “Mike,Sue,Matt”
          原因在于prototype的drivers是所有Car共享的一個對象。
          d) constructor和prototype的結合
          function Car(sColor, iDoors, iMpg) {
              
          this.color = sColor;
              
          this.doors = iDoors;
              
          this.mpg = iMpg;
              
          this.drivers = new Array(“Mike”, “Sue”);
          }


          Car.prototype.showColor 
          = function () {
              alert(
          this.color);
          }
          ;

          var oCar1 = new Car(“red”, 423);
          var oCar2 = new Car(“blue”, 325);
          oCar1.drivers.push(“Matt”);
          alert(oCar1.drivers); 
          //outputs “Mike,Sue,Matt”
          alert(oCar2.drivers); //outputs “Mike,Sue”
          That's more like it.
          內存沒有浪費,也沒有因為共享對象的問題,也可以使用instanceof操作符。
          e) 貌似還不夠 --動態創建
          function Car(sColor, iDoors, iMpg) {
              
          this.color = sColor;
              
          this.doors = iDoors;
              
          this.mpg = iMpg;
              
          this.drivers = new Array(“Mike”, “Sue”);
              
          if (typeof Car._initialized == “undefined”) {
                  Car.prototype.showColor 
          = function () {
                      alert(
          this.color);
                  }
          ;
                  Car._initialized 
          = true;
              }

          }
          這樣就產生了類似static的效果,Car.prototype的內容只需在第一次創建對象時被初始化。
          f) 改版后的Factory模式
          function Car() {
              
          var oTempCar = new Object;
              oTempCar.color 
          = “red”;
              oTempCar.doors 
          = 4;
              oTempCar.mpg 
          = 23;
              oTempCar.showColor 
          = function () {
                  alert(
          this.color)
              }
          ;
              
          return oTempCar;
          }
          不建議使用,除非實在需要(貌似和XML有關)

          12. 修改對象
          比較簡單,直接帖幾個例子
          Object.prototype.showValue = function () {
              alert(
          this.valueOf());
          }
          ;

          var str = “hello”;
          var iNum = 25;
          str.showValue(); 
          //outputs “hello”
          iNum.showValue(); //outputs “25”
          Function.prototype.toString = function () {
              
          return “Function code hidden”;
          }
          ;

          //The previous code is perfectly legal and works as expected:
          function sayHi() {
              alert(“hi”);
          }

          alert(sayHi.toString()); 
          //outputs “Function code hidden”

          學了不少,明天開始看繼承,恩
          主站蜘蛛池模板: 金川县| 堆龙德庆县| 庆安县| 和林格尔县| 荔浦县| 西昌市| 青州市| 新泰市| 福清市| 临沭县| 娄底市| 泾源县| 永泰县| 泾川县| 宁安市| 高邑县| 赣榆县| 七台河市| 大同县| 芜湖县| 扶沟县| 温州市| 抚远县| 阿坝县| 舒城县| 紫阳县| 桂平市| 双城市| 景宁| 海南省| 浮梁县| 高雄县| 腾冲县| 温州市| 毕节市| 普洱| 长子县| 葫芦岛市| 海门市| 汨罗市| 晴隆县|