微信小游戏--JS基础

版权声明:目前在职,联系16675190421 https://blog.csdn.net/qq_29019031/article/details/82825218

配置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;//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) //fun1为原方法,因为bind生成了新的方法对象,该相关的this为强制表,所以本this还是和环境有关的值console
new_fun.call({name :"" },3,4)//this还是强制表
结论:
强制的表显示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;//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(name,age)
{

 Enemy.call(this,name,age)//this为新表,,无表名
  
  //扩展字段
  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(“你好”,45);
boss.boss_attack();
boss.acctack_player(); //acctack_player方法中的this为新表,无表名

==========================================
函数重载:

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 和方法有关,单一new构造函数和new 类 不同

============================================
代码规范:
快捷方式: 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();

注意语法错误提示

猜你喜欢

转载自blog.csdn.net/qq_29019031/article/details/82825218