JavaScript面向对象

41 阅读4分钟

变量提升:
JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至作用域的顶端,然后进行接下来的处理,这就是变量提升。
js仅有两个作用域,函数中定义的变量仅能在本函数中使用,除此之外,其他变量皆是全局可用
注意:所有未定义直接赋值的变量自动声明为拥有全局作用域,并且该变量会挂载为window对象的属性
立即执行函数
语法:( function(){ 代码...} )()
作用:立即执行当前函数
javascript中变量仅有两种:全局变量与局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局属性
利用函数作用域搭配闭包就可以实现数据的访问控制

闭包优缺点
优点:当我们需要对一个变量进行私有化控制的时候,可以使用闭包函数。同时在函数内部可以对局部变量进行最值控制等操作。
缺点:使用闭包函数,也就引申出了一个内存泄漏的问题,由于js内存回收机制是标记清除法,就是一个数据在有引用的情况下,不会被释放,因为闭包内的数据在外部有使用,所以不会被释放,只能通过手动赋值null来释放。
JavaScript用一个花括号 { } 表示一个对象,对象中的成员通过键值对 key: value (键与值以冒号分割) 的形式进行声明,成员与成员之间通过逗号来分隔。如下,定义一个学生对象 liming:
var liming = {
stuNo: '321210333001', // 学生学号
major: '软件工程', // 专业
name: '李明', // 姓名
gender: 'male', // 性别
birth: 1990, // 生日
examination: function () {
console.log('参加考试...‘);
}
};

在JavaScript中,对象可以被理解为是一系列属性的集合,而一个属性由属性名和属性值(即键值对)两部分所构成,并且属性的值可以是一个函数(此时该属性就是对象的方法)。
JavaScript 中,除了以上的 { } 语法外,也可以通过 Object 构造函数和new关键字来构造JavaScript对象
var linhai = new Object();
linhai.stuNo = '321210333002'; // 学生学号
linhai.major = '计算机科学与技术'; // 专业
linhai.name = '林海'; // 姓名
linhai.gender = 'male'; //性别
linhai.birth = 1993; // 生日
linhai.examination = function () {
console.log('参加考试...');
};

JavaScript 使用一种被称为 构造函数 的特殊函数来定义对象和它们的特征,构造函数的 首字母一般采取大写 方式
function Student(stuNo, major, name, gender, birth, examination) {
this.stuNo = stuNo;
this.major = major;
this.name = name;
this.gender = gender;
this.birth = birth;
this.examination = examination;
}

在定义了构造函数后,便可以通过 new 创建对象实例。
调用构造函数传参时,需按照参数的顺序,依次传入相应的值即可完成对象及其属性的初始化。我们还可以传入一个函数来实现对象方法的初始化。
var xiaochi = new Student(
'321210333003',
'大数据',
'小池',
'female', 1993, function () {
console.log('参加考试...')
}
);
console.log(xiaochi.name); // 访问属性
xiaochi.examination(); // 调用方法

继承
继承是面向对象的一个重要特征,在面向对象编程中,当想要依据另一个类来定义一个类,直接获得另一个类的属性和方法时,既可以采用继承的方式来实现。
原型继承(Prototypal inheritance) 这个特性能够帮助我们实现这一需求
原型: 在JavaScript中,每个对象都拥有一个原型对象,对象可以从原型中继承方法和属性。
原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推,这种关系常被称为 原型链 ,它解释了为何一个对象会拥有定义在其他对象中的属性和方法。
proto 是 [[Prototype]] 的 getter/setter ,它与内部的 [[Prototype]] 不一样, __proto__并不是标准,但是是许多浏览器实现的属性。

call( ) 与 apply( )方法
两个方法都可以使用一个指定的 this 值,并单独给出的一个或多个参数来调用一个函数。call( )方法的语法和作用与 apply( ) 方法类似,两者的区别,就是 call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组。
obj.call(thisArg, arg1, arg2, ...)
obj.apply(thisArg, [arg1, arg2, ...])
作用:将obj中的this指向thisArg,后面的arg1,arg2...是可以附带的参数。