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

          JavaScript 學習 - Object Basics

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

          2. 創(chuàng)建對象
          基本和Java一樣,但對于無參構(gòu)造器,也可以使用類似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類
          翻了下,發(fā)現(xiàn)顯示當前時間只要new Date().toLocaleTimeString()就行了,寫Project2時土了

          8. Global類
          因為在JavaScript中并沒有單獨存在的函數(shù),所有的函數(shù)都必須是已經(jīng)存在的對象所屬的函數(shù)。
          于是有了Global類,包含所有“獨立”函數(shù)的類。
          貌似Global類的函數(shù)比較有用
          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
          區(qū)別在于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實際上是函數(shù)sayHi的一個方法。

          11. 還是創(chuàng)建對象
          由于JavaScript并沒有提供真正意義上的構(gòu)造方法,開發(fā)者們使用了不同的模式創(chuàng)建對象(怎么老覺得JavaScript這個語言是開發(fā)者在不斷適應它,而不是它不斷適應開發(fā)者呢 -,-)
          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的結(jié)合
          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.
          內(nèi)存沒有浪費,也沒有因為共享對象的問題,也可以使用instanceof操作符。
          e) 貌似還不夠 --動態(tài)創(chuàng)建
          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;
              }

          }
          這樣就產(chǎn)生了類似static的效果,Car.prototype的內(nèi)容只需在第一次創(chuàng)建對象時被初始化。
          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”

          學了不少,明天開始看繼承,恩
          主站蜘蛛池模板: 南郑县| 黄浦区| 通道| 武乡县| 荔浦县| 柏乡县| 宁化县| 铜陵市| 东源县| 张家界市| 芦溪县| 连南| 思茅市| 增城市| 丰顺县| 江山市| 玉田县| 香港 | 台中市| 五峰| 夏津县| 扎赉特旗| 确山县| 土默特左旗| 甘洛县| 库伦旗| 子洲县| 浮山县| 东兰县| 镇安县| 洪洞县| 象山县| 五指山市| 镇雄县| 左权县| 兰坪| 宾川县| 云梦县| 黄梅县| 修水县| 阜平县|