Javascript基础(1)

变量声明

var声明变量会在最先声明,但不会赋值,返回值为undefind
function声明函数也会在最先声明,但会直接进行定义,可以直接调用
函数有形参相当于提前声明变量

var a=123;
function fun(){
        alert(a);
        var a=456;
}
fun();
alert(a);    //undefind
var a=123;
function fun(){
        alert(a);
        a=456;
}
fun();
alert(a);    //456
var a=123;
function fun(a){
        alert(a);
        a=456;
}
fun();
alert(a);    //undefind 456

构造函数的执行流程

1.立刻创建一个新的对象
2.将创建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象
3.逐行执行函数中的代码
4.将新建的对象作为返回值返回

function Person(name,age,gender){
      this.name=name;
      this.age=age;
      this.gender=gender;
      this.sayName=function(){
          alert(this.name);
      };
}
var per= new Person("孙悟空",18,"男");
console.log(per);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

使用同一个构造函数创建的对象,我们成为一类对象,也将一个构造函数称为一个类。
我们将通过一个构造函数创建的对象称为该类的一个实例。

console.log(per instanceof Person);

使用instanceof可以检查一个对象是否是一个类的实例。
所有对象都是object后代,任何对象和object做instanceof都得到true。

call()和apply()

这两个方法都是函数对象的方法,需要通过函数对象来调用
当对函数调用call()和apply()都会调用函数执行
在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行的this
call()方法可以将实参在对象之后一次传递
apply()方法需要将实参封装到一个数组中统一传递

this的情况

  • 当以函数形式调用时,this是window
  • 当以方法的形式调用时,谁调用方法this就是谁
  • 当以构造函数的形式调用时,this就是新创建的对象
  • 使用call和apply调用时,this是指定的那个对象

原型prototype

我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是原型对象。
如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,他所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过_prototype_来访问该属性。
原型对象相当于一个公共区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。
当我们访问对象的属性或方法时,它会现在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,找到则直接使用

function Myclass(){
  }
Myclass.prototype.a=123;
var mc= new Myclass();
var mc2= new Myclass();
mc.a=234
console.log(mc.a); //234
console.log(mc2.a); //123

使用in检查对象中是否含有某个属性时,如果对象中没有但原型中有,也会返回true

console.log("name" in mc);

可以使用对象的hasOwnProperty()来检查对象自身是否含有该属性。

console.log(mc.hasOwnProperty("name"));

原型对象也是对象,它也有原型,当我们使用一个对象的属性和方法时,会在自身中寻找,有则直接使用,没有则去原型对象中寻找,有则直接使用,没有则去原型的原型中寻找,知道找到Object对象的原型,Object对象的原型没有原型。

console.log(mc.__proto__.__proto__.__proto__);//null

tostring()方法

当我们直接在页面中打印一个对象时,实际上输出的是对象的tostring()方法的返回值。
如果我们希望在输出对象时不输出[object object],可以为对象添加一个tostring()方法

per.tostring=function(){
 return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"
}

或者直接修改原型中的tostring()方法

Person.prototype.tostring=function(){
 return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"
}

垃圾回收

当一个对象没有任何的变量或者属性对它进行引用,此时我们将永远无法操作该对象,此时这种对象就是一个垃圾,这种对象过多会占用大量空间,使程序运行变慢,所以必须进行清理。
在js中有自动的垃圾处理机制,会自动的将这些垃圾对象从内存中销毁。
我们不需要也不能进行垃圾回收的操作
我们只需要将不再使用的对象设置为null即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。