天天看点

微信小游戏--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;//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();

注意语法错误提示

继续阅读