javascript基礎一

實例對象存在constructor指針指向構造函數;

prototype不能直接通過對象實例訪問, 可以通過構造函數名來獲得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
實例對象存在constructor指針指向構造函數;

prototype不能直接通過對象實例訪問, 可以通過構造函數名來獲得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
實例對象存在constructor指針指向構造函數;

prototype不能直接通過對象實例訪問, 可以通過構造函數名來獲得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;> 閉包: p199 嵌套函數不會將作用域內的私有成員複製一份,也不會對所綁定的變量生成靜態快照, 一個函數內的多個閉包將共享這個函數的局部變量;

一.語言簡介

  • 基於對象與事件驅動的相對安全的客戶端腳本語言;

  • 特點: 弱類型, 繼承基於原型, 對象的屬性名映射爲任意屬性名;

  • javascript: 核心ECMAScript, 文檔對象模型DOM, 瀏覽器對象模型BOM;
  • ECMAScript: 定義語法, 關鍵字, 保留字, 對象.., 3/5版本;
  • DOM:
  • BOM: browser object model, 可以控制瀏覽器頁面以外的顯示;

  • 引用了外部的.js文件, 則之間不能加代碼

  • undefined, null 都是空的,所以==時真, undefined是undefine類型, null是object類型, 指空對象;
  • 0/0 => NaN, 12/0 => Infinity
  • isNaN: 對象處理: 如果valueof不能返回數據則調用toString, 如果toString函數返回數字則是true;

二, 函數

  • 函數沒有重載功能, 調用的是最近定義的函數;

三, 對象

  • new創建: new object()
  • object()

  • 字面量創建{“A”: 14}

四. function

  • argument.callee 在函數內部調用自身
  • this指的是調用函數的對象
  • window是js下的全局對象: var a = 10; this.a ===window.a;
  • apply, call , call與apply只是傳遞參數不同其它一樣:
var nb = 10;
function sum(n1,n2){
   return n1+n2+nb;
}
function use(n1,n2){
     // this 指執行的對象,這裏是window
     return sum.apply(this,[ni,n2])
     // 或 return sum.apply(this,arguments)
     // 或 return sum.apply(this,n1,n2)
}

// apply, call主要用於實現函數執行域的替換
var box = {
     nb = 10
}
sum.apply(box,1,2) // => 1 + 2 + 123

四. 基本類型

  • 基本類型無法給自己創建新的屬性和方法,但可以調用系統內置的方法;

  • 而通過new 出來的基本類型是可以添加自定義的屬性和方法, 如var s = new String(“hebinbin”); s.name=”he”;

五. 面向對象

  • 構造函數沒有new object,也沒有return obj, 但調用時採用了new運算後則能夠在隱匿完成這些過程;

  • 構造函數無需返回值, 但即使有返回值也不會影響到new運行符的使用結果 (返回值無影響);

  • 構造函數是引用類型, 兩個同樣的對象的實例的函數不一樣 (地址不同), 這也可以認爲防止一個實例的函數改變不會影響另一個實例的函數; (函數是對象, 每次實例化時生成的函數自然不會一樣)

六. 原型

  • 構造函數裏的屬性是實例屬性;
  • prototype添加的屬性是原型屬性, 方法;

  • 實例屬性與實例方法的區別就是:共享, 原型屬性是所有實例對象共享的;

  • 實例對象自動根據prototype生成指針指向共享的proto對象, (IE不支持);

  • 實例對象存在constructor指針指向構造函數;

  • prototype不能直接通過對象實例訪問, 可以通過構造函數名來獲得: Box.prototype;
function Box(name,age){
    this.name = name;
    this.age = age;
}
Box.prototype = {constructor:Box}  
// 通過對象字面量構造的prototype如果不自己定義constructor對象指向Box的話,b1.constructor則只是object類型, 所以這裏需要手動加上;
Box.prototype.run = function() {
    return "hello"
};

var b1 = new Box("a",1);
alert(b1.constructor);

七. 繼承

  • 原型鏈繼承

  • 對象冒充只能繼承構造裏的信息,不會繼承原型裏的信息;

  • 組合繼承

function Box(name){
     this.name = name
}
Box.prototype.run = function(){
     return this.name + "hello"
}

function Drive(name){
     Box.call(this,name)
}
// 上面的Drive構造函數生成的對象是無法使用到Box的prototype對象裏的數據, 所以需要加上下面的語句:
Drive.prototype = new Box()

var d = new Drive("he")
alert(d.run());

如例子爲nodejs中繼承EventEmitter類, 使用事件監聽:

var util = require('util')
var events = require('events')
function MyE(){
    this.count = 0;
    events.EventEmitter.call(this);
}

util.inherits(MyE, events.EventEmitter);

// define a method
MyE.prototype.ping = function(){
    var self = this;
    setInterval(function(){
        ++self.count;
        console.log('ping' + self.count);
        self.emit('data')
    }, 1000);
};

var ee = new MyE();

ee.on('data',function(){
    ++this.count;
    console.log('pong' + this.count);
})

ee.ping();
  • 原型式繼承
function obj(o){
     function F(){}
     F.prototype = o
     return new F()
}

八. 閉包與私有成員

  • 閉包變量解除引用: b = null

  • 閉包運行的時候this指向的是window:

var user = "win";
var Box = {
    user:"box",
    run:function () {
        return function () {
            return this.user
        }
    }
};

alert(Box.run()());  // win
alert(Box.run().call(Box))  // box
  • 私有作用域: (var …; function(){…})();

  • 閉包封裝數據, 函數達到私有數據的效果;

function test(){
     for (var i = 0; i < 5; ++i){
          ...
     }
     alert(i);
}

// 私有作用域: 通過自我執行函數包裝
function test(){
     (function(){
          for (var i = 0; i < 5; ++i){
               ...
          }
     })();
     alert(i);   // undefined
}
  • 私有函數, 屬性
function test(){
     var privar = "11"  // 私有
     function run(){  // 私有
          ....
     }
     this.pubRun = function(){  // 公有
          run()
     }
};
  • 靜態成員
(function (){
     var data = 0;   // 靜態私有變量
     Box = function(value){  // 全局Box 構造函數
          data = value;  // 靜態
     }
     // 共享接口
     Box.prototype.getData = function(){
          return data;
     };
     Box.prototype.setData = function(v){
          data = v;
     }
})();

var b1 = new Box(10);
var b2 = new Box(20);  // 改變了靜態值
alert(b1.getData());  // 20
b2.setData(30);
alert(b1.getData());  // 30
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章