1. 程式人生 > >js高階程式設計入門理解

js高階程式設計入門理解

1、js有物件嗎,如果有物件,如何建立物件,物件裡面的內容又是什麼。

答:js有物件,通過 new 函式名建立物件,物件裡面的內容是prototype上的內容下面我們案例測試

window.onload= function () {
    function  Person(){
       var name="aa";
        var id=1;
    }
    var person=new Person();
    console.log(person);
    console.log(Person.prototype);
}
執行截圖可以知道person物件只有一個prototype屬性


我們檢視函式person.prototype上面的屬性發現是和person物件中prototype中的屬性一致


由此我們可以總結出js建立的物件是函式prototype上的內容,
prototype上的內容是個json資料。

2、函式的第二個特性,js函式可以動態新增屬性,而且新增到prototype
上面的屬性是可以被物件繼承的,沒有新增到prototype上面函式物件不可
能被繼承。下面我們來看個案例

window.onload= function () {
    function  Person(){
    }
    var person=new Person();
    person.name="nike";
    Person.prototype.id=1;
    var person1=new  Person();
    console.log(person.name);//js一大特性物件可以動態新增屬性
    console.log(person.id);
    console.log(person1.id);//物件通過prototype新增屬性可以實現繼承
    console.log(person1.name);//沒有通過prototype不能繼承,會報錯
    person.prototype.id=1;//<span style="color:#ff0000;">因為prototype中的屬性是個json資料,</span>
<span style="color:#ff0000;"></span><pre name="code" class="html" style="font-size: 30px;"><span style="color:#ff0000;"><span>	</span>//而json物件中不具有prototype屬性,所以報錯</span>
}
執行結果

3、動態新增屬性的運用,我們知道 面向物件的語言有一個標誌,即擁有類的概念,而類有一個特性就是有包名,但是在js中沒有包的概念,

但是通過js物件可以動態新增屬性的原理,我們可以自定義名稱空間。下面我們來看一個實現名稱空間的小案例

    function namespace(namespaceString){
        var temp = [];//聲明瞭一個空的陣列
        var array = namespaceString.split(".");
        for(var i=0;i<array.length;i++){
            temp.push(array[i]);
            /**
             * 把多個json物件添加了window上
             */
            eval("window."+temp.join(".")+"={}");
            //把多個function新增到了window上
            //eval("window."+temp.join(".")+"=function(){}");
        }
    }
    namespace("jsu.java.xiaozuo");
    jsu.java.xiaozuo.test=function(){
        console.log("小左");
    };
    jsu.java.xiaozuo.test();
}
執行結果


4、上面我們提到了prototype屬性實現繼承,那麼現在我們開始深入瞭解下繼承,我們知道java實現面向物件程式設計無非就是多型繼承機制。那麼在js中如何實現

將父親的東西給兒子呢,下面我將通過prototype特性一個小案例,將已有的新增到新新曾的屬性中去,這裡描敘的不是很清楚(大家看案例消化)。我感覺在這裡這麼說可以更好的理解,就是將幾個物件組合(或者叫合併機制);想必看過程式設計思想的也知道面向物件中也有組合這種思想。

namespace("jsu.java.xiaozuo");
jsu.java.xiaozuo.extend = function(destination,source){
    if(typeof destination == "object"){//destination是一個json物件
        if(typeof source == "object"){//source是一個json物件
            //把source中的每一個key,value值賦值給destination
            for(var i in source){
                destination[i] = source[i];
            }
        }
    }
    if(typeof destination == "function"){
        if(typeof source == "object"){
            for(var i in source){
                destination.prototype[i] = source[i];
            }
        }
        if(typeof source == "function"){
            destination.prototype = source.prototype;
        }
    }
    return destination;
}
var destination = jsu.java.xiaozuo.extend({
    cc:'cc'
},{
    aa:'aa',
    bb:'bb'
});

console.log(destination.aa);


var destination2= jsu.java.xiaozuo.extend(destination,{
    dd:'dd'
});
console.log(destination2.aa)
console.log(destination2.dd)
輸出結果:


5、下面簡單介紹下回調,個人水平有限,只是知道分裝的ajax不知道得到返回結果應該怎麼樣處理,這種業務邏輯就應該由程式設計師去制定,那麼我們可以在方法中傳遞一個函式,在方法內部,當得到結果時執行該函式(個人與java相比的話,與java中的泛型目的類似,當我們在寫基類時,確實不知道子類將傳遞一個什麼給我們的時候,這時候泛型就幫我們解決了這個問題)

如jquery中的$("").post(url,type,function); 應用場景可以這麼理解吧,當我們在分裝一個通用的功能時,但是在函式內部某些業務邏輯我們不知道怎麼做時,這是我們就可以運用回撥函式解決這個問題。

6、下面接著另外一個重要的知識點。

閉包的概念:

閉包就是能夠讀取其他函式內部變數的函式。由於在Javascript語言中,只有函式內部的子函式才能讀取區域性變數,因此可以把閉包簡單理解成"定義在一個函式內部的函式"。
說了概念大家可能有點悶,下面我就兩個應用場景來講下閉包的重要性,
 (1)繼承的封裝
上面可以說進行了初步的使用,命名函式的實現就是一個繼承的分裝。 
(2)匿名函式
將匿名函式之前我們先將下面三個概念理清楚下

一、函式宣告、函式表示式、匿名函式

函式宣告:function fnName () {…};使用function關鍵字 宣告一個函式,再指定一個函式名,叫函式宣告。

函式表示式 var fnName = function () {…}; 使用function關鍵字宣告一個函式,但未給函式命名,最後將匿名函式賦予一個變數,叫函式表示式,這是最常見的函式表示式語法形式。

匿名函式:function () {}; 使用function關鍵字宣告一個函式,但未給函式命名,所以叫匿名函式,匿名函式屬於函式表示式,匿名函式有很多作用,賦予一個變數則建立函式,賦予一個事件則成為事件處理程式或建立閉包等等。

看了第三個的定義大家都蒙了,這樣的函式我們該如何呼叫呢。
匿名函式的呼叫這樣的,上案例吧,
(
    function(num){
        alert(num);
    }
)(3);

執行結果:


沒錯就是這樣呼叫的,而且可以傳遞引數。

現在讓我們通過閉包演示下一個類似於javabean類把

(function(window){
	function Person(){
		return {
			setName:setName,
			getName:getName
		};
	}
	/**
	 * 公開的函式
	 * @param {Object} name
	 */
	function setName(name){
		this.name = name;
	}
	function getName(){
		return this.name;
	}
	/**
	 * 私有函式
	 */
	function aaa(){
		
	}
	function bbb(){
		
	}
	//給window物件動態的添加了一個屬性Person
	window.Person = Person;
})(window);
var Person = window.Person();
Person.setName("aaa");
alert(Person.getName());

7、jquery核心講解

//低版本中jquery核心解析 jQuery JavaScript Library v1.4.2
//看到這裡我們會發現jquery本身是一個閉包函式,
(function( window, undefined ) {
// Define a local copy of jQuery
//在內部表示式中jquery返回了jquery物件。
var jQuery = function( selector, context ) {
      // The jQuery object is actually just the init constructor 'enhanced'
      return new jQuery.fn.init( selector, context );
   },
   //在jquery prototype屬性上新增方法,實現繼承。
   //fn是jquery上的一個屬性,這個屬性指向了jquery的prototype
   //jquery選擇器構造出來的物件,就像是利用jquery構造器構造
   //出來的物件一樣,這些物件可以繼承jquery.fn或jquery.prototype上的方法
   jQuery.fn = jQuery.prototype = {
      each: function( callback, args ) {
          return jQuery.each( this, callback, args );
       },

       ready: function( fn ) {
          // Attach the listeners
          jQuery.bindReady();

          // If the DOM is already ready
          if ( jQuery.isReady ) {
             // Execute the function immediately
             fn.call( document, jQuery );

          // Otherwise, remember the function for later
          } else if ( readyList ) {
             // Add the function to the wait list
             readyList.push( fn );
          }

          return this;
       },
   }
   // Expose jQuery to the global object
   //這裡實際是在window物件上添加了jquery和$兩個屬性,這兩個屬性的值
   //jquery構造器。我們能想象$("");就是呼叫了上面的構造器方法,返回了
   //一個jquery物件,繼承了prototype上的方法。
    window.jQuery = window.$ = jQuery;

    })(window);




下面我們就對jquery進行外掛擴充套件,如下通過閉包函式,就在jquery上和jquery.prototype及jquery物件上添加了alert()方法。

(function($){
$.alert = function(msg){
window.alert(msg);
}

$.fn.alert = function(msg){
window.alert(msg);
}
})($);

到這裡jquery的高階基礎入門結束了,下面有個較為複雜一點的案例

(function(jQuery){
	jQuery.fn.myeach = function(callback){
		var array = $(this);
		for(var i=0;i<array.length;i++){
			//this代表當前正在遍歷的物件
			callback.call($(array[i]),$(array[i]));
		}
	}
	/**
	 * @param {Object} obj  可以來自於利用jquery的選擇器建立的jquery物件,也可以來自於一個數組(來源於後臺)
	 * @param {Object} callback
	 */
	jQuery.myeach = function(obj,callback){
		var array = obj;
		for(var i=0;i<array.length;i++){
			//this代表當前正在遍歷的物件
			callback.call($(array[i]),$(array[i]));
		}
	}
})(jQuery);

$().ready(function(){
	$("div").myeach(function(){
		//this代表當前正在遍歷的div物件
		alert($(this).text());
	});
	
	$.myeach($("div"),function(e){
		alert($(e).text());
	});
});

相關推薦

js高階程式設計入門理解

1、js有物件嗎,如果有物件,如何建立物件,物件裡面的內容又是什麼。 答:js有物件,通過 new 函式名建立物件,物件裡面的內容是prototype上的內容下面我們案例測試 window.onload= function () { function Person

js高階程式設計筆記 -- 理解繼承

1.原型鏈 原型鏈作為繼承的主要方法。基本思想是利用原型讓一個引用型別繼承另一個引用型別的屬性和方法。 function SuperType() {   this.property = true; } SuperType.prototype.getSuperValue

js學習記錄(三)《js高階程式設計》讀書筆記2

今天開始讀第三章——基本概念: 接下來說明了一些細節,包括語法,區分大小寫,識別符號,註釋,嚴格模式?等等。這一部分在程式設計的過程中自然會注意到。 接下來是重要的內容: 3.3變數: 這裡跟原來對變數的直覺理解是不一樣的。原來會把變數想象成是一個盒子,盒子

Unix環境高階程式設計入門----Unix環境及系統資料資訊使用

                                         Unix環境高階程式設計入門                                                   ----Unix環境及系統資料資訊使用          Uni

JS高階程式設計

定義 基於事件和物件驅動,並具有安全效能的指令碼語言 執行在客戶端瀏覽器 運作在伺服器名稱為node.js 出現背景 《JavaScript高階程式設計》 javaScript 誕生於 1995 年。當時,它的主要目的是處理以前由伺服器端語言(如 Perl)負責的一 些輸入驗

js高階程式設計 筆記

一,變數和作用域   1, js變數可以儲存兩種型別,基本型別、引用型別和symbol型別,基本型別有5種:undefined、null、boolean、number、string,它們都有以下的特徵 基本型別在記憶體中佔據固定大小的空間,因此被儲存在棧記憶體中 從一個變數

基於JS高階程式設計的一些總結

1.建立物件的方法  var person = {};     var person = new Object();     {} 和new Object()是等價的,都代表物件 2.建立陣列的方法

js高階程式設計筆記7--DOM2和DOM3

選擇符API Selectors API是由W3C發起制定的一個標準。致力於讓瀏覽器原生支援CSS查詢。 querySelector()方法 此方法接收一個CSS選擇符,返回與該模式匹配的第一個元素。如果沒有找到返回null. var body

一:js高階程式設計之:遞迴

遞迴函式是在一個函式通過名字呼叫自身情況下夠成的,如: function factorial(num){ if(num <= 1){ return 1; }else{ return num*factorial(num-1) } } 這是一經典的遞迴階乘函式;表面這個

JS高階程式設計第2章--精簡版

前言:純手打!!!這次是二刷了,想暑假做一次完整的筆記,但用本子來寫筆記的話太貴了,可能哪天還丟了。。所以還是部落格好==  第二章:在HTML中使用JavaScript 2.1 <script>元素:   即在HTML頁面插入JS的主要方法。HTML4.01定義了以下JS屬性(主要

《JavaScript高階程式設計》——JS基本概念之資料型別

ECMAScript 中有五種簡單資料型別(基本資料型別):Undefined、Null、Boolean、Number 和 String。還有一種複雜資料模型:Object。 資料型別 1 typeof 操作符 typeof 用來檢測給定變數的資料型別。對一個值使用 typeof

Javascript高階程式設計學習筆記(三)—— JS中的資料型別(1)

 前一段時間由於事情比較多,所以筆記耽擱了一段時間,從這一篇開始我會盡快寫完這個系列。 文章中有什麼不足之處,還望各位大佬指出。 JS中的資料型別 上一篇中我寫了有關JS引入的Script標籤相關的東西。 那麼這一篇,我們可以正式進入JS的世界了,emmm 前面的東西應該比較基礎,大佬們不

《Javascript 高階程式設計(第三版)》筆記0x8 OOP 理解物件

         ECMA-262 把物件定義為:“無序屬性的集合,其屬性可以包含基本值、物件或者函式。”嚴格來講,這就相當於說物件是一組沒有特定順序的值。物件的每個屬性或方法都有一個名字,而每個名字都對映到一個值。  

深入理解JS非同步程式設計五(指令碼非同步載入)

非同步指令碼載入 阻塞性指令碼 JavaScript在瀏覽器中被解析和執行時具有阻塞的特性,也就是說,當JavaScript程式碼執行時,頁面的解析、渲染以及其他資源的下載都要停下來等待指令碼執行完畢 瀏覽器是按照從上到下的順序解析頁面,因此正常情況下,J

[Javascript 高階程式設計]學習心得記錄9 js面向物件

    感覺最難的部分就是面向物件了,大學期間學習的是面向過程的c/c++,工作之後也沒有深入瞭解過面向物件,通過這次的學習和回顧,也算是對面向物件有了新的認識。不過,就我在書上學到了結合個人理解隨便說說,很可能有理解錯誤或者不準確的地方。js的物件和其他語言的物件並不完全

[Javascript 高階程式設計]學習心得記錄10 js函式表示式

    在前面說物件的時候已經提到了函式物件,對函式的定義引數的傳遞包括通過argumentd.callee實現遞迴。這篇部落格我會繼續深入講解js中的函式表示式。 一,閉包     關於閉包的概念,可以先看看http://www.jb51.net/article/2410

JavaScript高階程式設計閉包學習理解

在學習了JavaScript高階程式設計閉包這一部分內容後,感覺很難理解。以下是從網上收集的一篇不錯的文章,希望能更好的幫助我理解閉包。 前言:還是一篇入門文章。Javascript中有幾個非常重要的語言特性——物件、原型繼承、閉包。其中閉包 對於那些使用傳統靜態語言C/

[Javascript 高階程式設計]學習心得記錄11 js的BOM

    BOM(瀏覽器物件模型)是web中js的核心,而BOM的核心物件就是window物件。在瀏覽器中,window物件有雙重角色,它既是通過js訪問瀏覽器的一個介面,又是規定的Global物件。此外,還有location等物件,因為整體比較簡單,下面說一些值得注意的東西

Js中函數語言程式設計理解

# 函數語言程式設計的理解 函數語言程式設計是一種程式設計正規化,可以理解為是利用函式把運算過程封裝起來,通過組合各種函式來計算結果。函數語言程式設計與指令式程式設計最大的不同其實在於,函數語言程式設計關心資料的對映,指令式程式設計關心解決問題的步驟。 ## 描述 到近些年,函式式以其優雅,簡單的特點開始重

es6+react.js組件入門初探

mount scrip 內部 cte 起源 我們 一個 目前 開源 React是一個用於構建用戶見面的javascript庫。 React主要用於構建UI,許多人認為React是MVC中的V(視圖) React起源於Facebook的內部項目,用來架設Instagram的網