微信小遊戲--JS基礎
配置Node.js環境: 1.下載64位Node.js 2.開啟CMD查詢是否安裝成功或者版本號 node -v =======================================
IDE :subline
=======================================
資料夾隱藏副檔名=》在檔名選項修改或者勾選副檔名 設定預設編輯器=》選擇開啟方式修改
=========================================== 可以解析執行js:node,瀏覽器(指令碼語言只有解析,不用編譯) node解析步驟: 1書寫js檔案 2在js檔案的資料夾內 shift+右鍵=》window PowerShell 3輸入dir檢視js資訊 4輸入node main.js 點Tab自動補齊
注意 :儲存檔案並且js語句開頭要小寫
註釋:// 多行註釋 /* */
win10編輯卡頓 =》右鍵屬性,取消快速編輯
windos PowerShell 命令快取=》 上下鍵
========================================== 變數 :自動記憶體分配 js變數只存該語言型別的資料和引用 js使用var定義變數 var a1=8 ; var a2=7.5 ;var a3=true;
通過行數,提示原因找錯誤 undefine :未定義,即使定義了變數不賦值或者賦值不對也會報錯
var a=null(允許)
取得變數型別 var b=false type of b
注意變數使用範圍
=============================================== 表示式: 賦值= 算術:+-*/ % 括號 判斷: >= <= == != <> 字元連線 console.log(re,re+4) :沒有改變re的值 簡化表達 : += -= -- ++ ================================================= 條件 : if() { } else {} 多條件: if(條件) else if(條件) else if (條件) else
邏輯運算子 :&& ||
注意 :儘量不要在判斷語句中做運算 num+=1 if(num)
//多條件,case swich (value) { case 1: {} break;
case 2: {} break ; case 3: {} break; defalut : {} break ;
}
迴圈 : while (條件) {
}
for(初始化語句;條件判斷;迭代遞增或者遞減) {
} var i=4; var j=5; for(i=5,j=6;i+j<80;i=i+1,j=j+1) {}
迴圈控制 :運用場景:for,while continue(跳出本次迴圈) break 終止迴圈 =============================================== 字串 : var str=“XXX”; var str=‘XXX’;
var array=【】;空陣列 array=【1,2,3,4】; 數字
array=【1,true,“Hello“,【1,2,3】】 陣列巢狀 0作為陣列索引開始
注意索引是否越界
=============================================== 表 var table= { age:14; name: "XXX"; arrayxxx:【1,2,3,{ adrr:”127.0.0.1“, port:6000 }] }】
table : { XXX :XXX X } array2;array }
表可以存放所有的資料型別 , 陣列內可以存表 ,表存陣列
表的訪問 =》key本質字串 array2【”XXX“】 array2.XXX;
整數key只能 表物件【整數值】 或者【”整數值“】訪問
增加表成員 :表物件.XXXkey=XXX; ========================================== 函式: fuction XXX(引數) {
程式碼塊
} function XXX(a1,a2) { XXXXXXXX; retun XXX;(返回並跳出方法) } 呼叫 : XXX(3,4);
存放結果: var ret=XXX(3,4);
引用傳遞 : var my_add=XXX; ret =my_add(3,4);
表中存方法=》 var mathabc={
my_add:XXXXXXXX; func_key :fuction() { XXXXXXXX }
} var ret =mathabc.my_add(3,5);
mathabc.func_key();
======================================================= Math函式: Math.PI ;圓周率 Math.random(); [0,1) 0到1 不包含1的小數
var value=min+(max-min+1)*Math.random();
向下取整: Math.floor();
三角函式 sin ,cos,tan
value =Math.sin(XXXXXXXX);//傳入弧度
var degree=r*180/Math.PI ( 傳入r 為弧度,轉為角度)
var r=(degrees/180)*Math.PI; (傳入degrees為角度,轉為弧度)
反三角函式 value =Math.asin() //傳入弧度
atan2 :返回座標角度 範圍(-180,180]=>(-PI,PI] var r=Math.atan2(1,1); value =rad2deg(r);轉角度
Math.sqrt();開根號
====================================================
陣列高階使用 : array .length;
for(var index in array) {
} for(var i=0;i<array_data.length;i++) {
} 陣列新增物件 array_data.push(100); array_data.push("Hello"); array_data.push({ key :"value"
}) 找索引: var array_data.indexOf(300)//填寫的是陣列的值 引數=>從2索引開始,刪除個數 var data2=array_data.splice(2,2);
陣列排序: array_data=[1,2,3,4]; sort傳入方法 array_data.sort( function(Ihs,rhs) { if(Ihs>rhs) {
return -1; } else if (rhs>Ihs) {
return 1; } else { return 0;//Ihs==rhs
}
})
隨機排序
array_data.sort( function ( Ins,rhs) { if(Math.random()<=0.5) { return -1; } else { return 1;
}}) 抽取隨機: value =array_data[0] ============================================= 表的高階使用:
刪除對應的key delete XXX["XX "] delete XXX.sss;
============================================== 字串高階 :
var str="XXXX " str.length; str.indexOf("X") 首次出現位置索引 var new_str= str.replace("X","3q")//替換,產生新物件 大小寫併產生了新物件 str.toLowerCase(); str.toUpperCase();
============================================ require("./XXX") 第一次載入js檔案並執行=>如果載入過就不執行,但都返回一個module.exports物件,需要在被載入的檔案中定義module.exports物件,沒有定義則返回{} 載入的檔案通過util可以呼叫被載入的js中的物件 載入: var util=require("./XXX") 被載入: var utils= { add:add, test:test,
}; module.exports=util; 一般用類名定義接收,易於查詢
============================================
function fun1(a1,a2) { this;
}
1.this的顯示傳遞=>上層決定this 函式.call : fun1.call({ XXXX },3,4) this={XXXX} 可以是表或者任意物件
2.this的隱式傳遞=> var tools= { fun1:fun1,
} 表的函式key() tools.fun1=>this=表
3.this的強制傳遞 =>底層決定this var new_fun=fun1.bind({name ;"blake'}); new_fun(3,4); tools.fun1=new_fun; tools.my_fun(3,4); 結果this依舊為強制表
fun1(3,4) //不是強制表,因為bind生成了新的方法物件,所以this還是和環境有關的值console new_fun.call({name :"" },3,4)//還是強制表 結論: 強制的表顯示call,隱式也無法改變
============================================= 建構函式=> function:可以填充表字段物件 function person(name,age) { this.name=name;//增加屬性
}
person.prototype : 函式的表 ,函式未初始時為空表,可以填充方法,類的原型 person.prototype.get_age=function() { return this.age;
}
var blake=new person("blake"); //step1:產生一個新表,呼叫person的方法,相當於顯示call傳遞this=》this表示新表 step2:同時會產生一個物件 (新表._proto_),並複製prototype表的內容 var ret=blake.get_age();
注意點 1會先去blake表中去尋找是否有get_age()key,沒有就去新表._proto_下去找 2如果沒有強制的this繫結, 新表.方法=>this為新表 3只有新表的欄位屬性和_proto_是屬於新表的,其他的如方法只是new 新物件新增欄位的手段,prototype是方法的複製手段
等價於=> function new_person(name) { var instance={}; person.call(instance,name);//把instance作為this ,this.name為instance表新增key instance._proto_={}; for(var key in person.prototype) { instance._proto_[key]=person.prototype[key]; } return instance;
}
var xiaohong =new_person("xiaohong")
var ret=xiaohong.get_age();
等價於=》 var my_person= { name:"XXXX"; age :12, _proto_ : { get_name:person.prototype.get_name, get_age:person.prototype.get_age,
} }
=========================================================== 錯誤 : Invalid or unexpected token(無效或者意外標記)=》格式不正確=》注意逗號,括號
============================================================== subline快捷鍵: https://blog.csdn.net/mycms5/article/details/70194045/ 多行註釋 ctrl+ “+”+ / ============================================================== 類:通過構造方法和xxx.prototype(類的成員函式)組成類,一類組成結構相同的物件 建構函式和成員函式中的this為各自的類,可以完成各自的邏輯。 Enemy.js: function Enemy(name ,age) { this.name=name; this age=age;
} Enemy.prototype.acctack_player=fuction() { consele.log("attack_player",this);//this代表Enemy新表
} module.exports=Enemy;
main.js: var Enemy=require(“./Enemy”) var e1=new Enemy("hao",12); e1.attack_player(); var e2=new Enemy("jj",16); e2.attack_player(); ========================================================= 類的繼承=>獲取原型方法,擴充套件方法 錯誤寫法 :BossEnemy.prototype=Enemy.prototype => 原因: 只是傳遞了Enemy.prototype的引用,並沒有複製物件到BossEnemy.prototype中,改變表值會改變 Enemy.prototype的值
方法和欄位的繼承和擴充套件
方法1: 迴圈複製物件 function BossEnemy() {
Enemy.call(this,name,age)//this為新表,但表名為Enemy //擴充套件欄位 this.blood=90;
} BossEnemy.prototype={} for(var i in Enemy.prototype) { BossEnemy.prototype[i]=Enemy.prototype[i]; }
方法2: 利用new機制複製
var a =function(){}//空表,只有prototype物件 a.prototype=Enemy.prototype; BossEnemy.prototype=new a(); =>a._proto_=>Enemy.prototype
擴充套件方法: BossEnemy.prototype.boss_attack=fuction() {
XXX;
} var boss=new BossEnemy(); boss.boss_attack(); boss.acctack_player(); //acctack_player方法中的this為新表,但表名為Enemy
========================================== 函式過載:
BossEnemy.prototype.attack_player=function() { Enemy.prototype.attack_player.call(this);//呼叫父類的attack_player,傳入的是boss表
return this.name; } boss.attack_player();
=========================================== 繼承函式=>實現類的繼承和擴充套件 Class結構
Class( { extend :Enemy, //繼承物件 init :function() { } boss_attack:function() { }, add:function() { }
}
);
var BossEnemy2 =function Class(Class_desic)//傳入定義Class引用 { var new_class=function(name,age)//new_class的建構函式,可以傳入引數 { //欄位繼承 if(Class_desic.extend) { Class_desic.extend.call(this,name,age)//呼叫基類建構函式 } //欄位擴充套件 if(Class_desic.init) { Class_desic.init.call(this);//呼叫新類Class的初始函式 } } //方法繼承 if(Class_desic.extend) { var a=fnction (){}; a.prototype=Class_desic.extend.prototype; new_class.prototype=new a(); } else { new_class.prototype={}; } //方法擴充套件 for(var i in Class_desic) { if(i=="extend") { continue;} new_class.prototype[i]=Class_desic[i]; } return new_class;// BossEnemy2=new_class
}
var b2=new BossEnemy2("whhw",32); //呼叫Class方法,傳遞 this, this為 new_class
============================================ 程式碼規範: 快捷方式: ctrl+c, ctrl+v 跳過單詞;ctrl+left or right; 選擇單詞 ctrl+shift+left or right 選中一行:shift+home or end 選中多行:shift+ up or down
win+E shift+右鍵
縮排:一個Tab
命名: 1駝峰 getName(); 2匈牙利 GetName,要加上型別標識 :iAge fDistance 3Linux命名 get_age
空格注意整齊 for(var i=0; i<=10,i++)
var utils=require("utils") //指令碼名稱和定義的名稱相同可以方便尋找指令碼物件 util.abc();
注意語法錯誤提示