Day8

1什么是构造函数?

构造函数是bai一种特殊的成员函数du,它主要用于为对象分配存zhi储空间,对数据成dao员进zhuan行初始化.构造函数shu具有一些特殊的性质:
(1)构造函数的名字必须与类同名;
(2)构造函数没有返回类型,它可以带参数,也可以不带参数;
(3)声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;
(4)构造函数可以重载,从而提供初始化类对象的不同方法;
(5)若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空.

2-创建对象的方式有哪些?举例说明

一.最基本的:类名 对象名 Person person = new Person();
二.匿名对象:new 类名() new Person();
三.通过反射: Class c = Class.forName("类的全路径"); Person person = (Person)
c.newInstance();

3-js 种实现继承的方式

// 定义一个动物类
function Animal (name) {
  // 属性
  this.name = name || 'Animal';
  // 实例方法
  this.sleep = function(){
    console.log(this.name + '正在睡觉!');
  }
}
// 原型方法
Animal.prototype.eat = function(food) {
  console.log(this.name + '正在吃:' + food);
};


1、原型链继承

核心: 将父类的实例作为子类的原型

function Cat(){ 
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat('fish'));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true 
console.log(cat instanceof Cat); //true


2、构造继承

核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)

function Cat(name){
  Animal.call(this);
  this.name = name || 'Tom';
}

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true


4、拷贝继承

function Cat(name){
  var animal = new Animal();
  for(var p in animal){
    Cat.prototype[p] = animal[p];
  }
} // Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.sleep()); console.log(cat instanceof Animal); // false console.log(cat instanceof Cat); // true

 

4-什么是闭包?有什么作用?

如果一个函数用到了它作用域外面的变量,那么这个变量和这个函数之间的环境就叫闭包。

闭包的用途有些什么:

1.模仿块级作用域

所谓块级作用域就是指在循环中定义的变量,一旦循环结束,变量也随之销毁,它的作用范围只在这一小块。而在JavaScript中没有这样的块级作用域,由于JavaScript不会告诉你变量是否已经被声明,所以容易造成命名冲突,如果在全局环境定义的变量,就会污染全局环境,因此可以利用闭包的特性来模仿块级作用域。

 

 

在上面的代码中,闭包就是那个匿名函数,这个闭包可以当函数X内部的活动变量,又能保证自己内部的变量在自执行后直接销毁。这种写法经常用在全局环境中,可以避免添加太多全局变量和全局函数,特别是多人合作开发的时候,可以减少因此产生的命名冲突等,避免污染全局环境。

2.储存变量

闭包的另一个特点是可以保存外部函数的变量,内部函数保留了对外部函数的活动变量的引用,所以变量不会被释放。

 

 

 这种写法可以用在把一些不经常变动计算起来又比较复杂的值保存起来,节省每次的访问时间。

5-什么是预解析?

在当前的作用域下,js运行之前.会有带有 var 和 function关键字的代码事先声明,
并在内存中安排好,然后从上到下的执行js代码.

JS预解析 js逐行执行

js对什么进行预解析
1> var 后面的变量
2> 函数 
3> 函数传参的变量

1.通过var关键字定义的变量进行预解析的时候,都是声明declare,不管他有没有赋值,都会赋值为undefined。
凡是传参,直接赋值
alert(a);
var a = 1;
alert(b);
var b = function(){

}
alert(c);
var c;

2.function进行预解析的时候,声明而且定义了define,但它存储数据的那个空间存储的是代码是字符串,没意义
alert(a);//函数的字符串
function a(){
alert("预解析的function1")
}
3.预解析中想实现立即执行的函数 放到()一对括号当中去
(function fn(){
alert("预解析的function1")
}(2));闭包
(function(){
alert("预解析的function2")
}());


posted @ 2021-02-05 16:43  景沁同学  阅读(59)  评论(0)    收藏  举报