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

          JavaScript 學(xué)習(xí) - Object Basics

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

          2. 創(chuàng)建對(duì)象
          基本和Java一樣,但對(duì)于無(wú)參構(gòu)造器,也可以使用類似Delphi的沒有括號(hào)的語(yǔ)法。
          var oStringObject = new String;

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

          4. 由于弱類型機(jī)制,ECMAScript不支持早期綁定,因此對(duì)象的方法和屬性可以在運(yùn)行期定義。

          5. ECMA-262定義的基礎(chǔ)類:
          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() 方法略,還有個(gè)貌似挺麻煩的splice方法。

          7. Data類
          翻了下,發(fā)現(xiàn)顯示當(dāng)前時(shí)間只要new Date().toLocaleTimeString()就行了,寫Project2時(shí)土了

          8. Global類
          因?yàn)樵贘avaScript中并沒有單獨(dú)存在的函數(shù),所有的函數(shù)都必須是已經(jīng)存在的對(duì)象所屬的函數(shù)。
          于是有了Global類,包含所有“獨(dú)立”函數(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處理所有特殊字符。
          相應(yīng)的有decodeURI和decodeURIComponents方法。
          b)
          eval 方法
          很強(qiáng)大,但要小心使用,容易被注入惡意代碼。

          9. Math 類
          用的時(shí)候再查API吧。。。

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


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

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

          11. 還是創(chuàng)建對(duì)象
          由于JavaScript并沒有提供真正意義上的構(gòu)造方法,開發(fā)者們使用了不同的模式創(chuàng)建對(duì)象(怎么老覺得JavaScript這個(gè)語(yǔ)言是開發(fā)者在不斷適應(yīng)它,而不是它不斷適應(yīng)開發(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這個(gè)方法在外部聲明,然后使用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操作符進(jìn)行類型判斷。但也有缺陷,例如
          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共享的一個(gè)對(duì)象。
          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)存沒有浪費(fèi),也沒有因?yàn)楣蚕韺?duì)象的問題,也可以使用instanceof操作符。
          e) 貌似還不夠 --動(dòng)態(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)建對(duì)象時(shí)被初始化。
          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;
          }
          不建議使用,除非實(shí)在需要(貌似和XML有關(guān))

          12. 修改對(duì)象
          比較簡(jiǎn)單,直接帖幾個(gè)例子
          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”

          學(xué)了不少,明天開始看繼承,恩
          主站蜘蛛池模板: 湖口县| 新源县| 县级市| 右玉县| 福泉市| 广河县| 广昌县| 隆子县| 乌兰察布市| 柘城县| 宜兰市| 静乐县| 东阿县| 阳谷县| 十堰市| 钟山县| 庆元县| 文安县| 布尔津县| 略阳县| 蕉岭县| 丰城市| 庄河市| 陕西省| 定西市| 九龙坡区| 浦东新区| 体育| 双鸭山市| 黄大仙区| 深圳市| 旅游| 竹山县| 静宁县| 灵璧县| 井冈山市| 北海市| 峨眉山市| 龙里县| 甘洛县| 白玉县|