JavaScript-面向对象详解
对象的概述
JavaScript是基于面向对象的语言。在JavaScript中几乎所有的东西都是对象或者用起来像对象。对象是一组无序的有命名值(属性)的集合,可以是对象、基本值,以及函数。
对象的创建
1.字面量方法
var myObj = {};
2.构造函数
内置构造函数 Object()
var newObj = new Object();
缺点:使用同一个接口创建对象,会产生大量的重复代码。
3.工厂模式
工厂模式抽象了对象创建过程,也就是把一个对象的创建过程封装到一个函数里。实例如下所示:
function createPerson(name,age,sex) {
var o = new Object();
o.name = name;
o.age = age;
o.sex = sex;
o.sayName = function() {
alert(this.name);
}
return o;
}
var user1 = createPerson("cqs",11,"男");
工厂模式的缺点:
1.空间没有得到优化,从而降低了性能,产生资源浪费。
2.没有new的过程,语义性不好。
3.工厂模式并没有解决对象识别问题,也就是并不知道创建的对象属于那种特定类型的对象。
4.构造模式
通过自定义构造函数创建特定类型的对象。
构造函数实例化过程,调用构造函数创建对象会经历几个过程,如下所示:
new的原理
1.创建一个新的对象
2.将构造函数的作用域赋给新对象,所以这个时候this就指向新的对象
3.执行构造函数中的代码(即为新对象添加属性)
4.返回新对象
var Person = function(name,age,sex){
this.sex = sex;
this.age = age;
this.sex = sex;
}
var user1 = new Person("cqs",11,"男");
备注:根据约定构造函数第一个单词的开头字母要大写。
与工厂模式的不同
1.没有显示的创建对象;
2.直接将属性和方法赋给新对象(this);
3.没有return语句。
构造函数模式的缺点:
在每次实例化对象过程中,方法都要被重新创建,在JavaScript中函数方法也是对象,因此没创建一个函数,也就是实例化一个对象。这样必然导致消耗内存。可以通过原型模式来解决这种问题。
5.原型模式
描述原型
每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含了可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来解释,那么prototype就是通过调用构造函数而创建那个对象实例的原型对象。使用原型的好处就是能够让它的所有对象实例都能够共享它的属性和方法(也是不好的地方)。换句说,就是不必在构造函数中定义实例化对象的信息,而是将这些信息直接添加到原型对象中。
原型实例,如下所示:
function person(){
};
person.prototype.name = "cqs";
person.prototype.age = 11;
person.prototype.sex = "男";
person.prototype.method = function() {
alert(this.age);
}
var user1 = new person();
var user2 = new person();
user1.method();
console.log(user1 == user2);
};
person.prototype.name = "cqs";
person.prototype.age = 11;
person.prototype.sex = "男";
person.prototype.method = function() {
alert(this.age);
}
var user1 = new person();
var user2 = new person();
user1.method();
console.log(user1 == user2);
详解:实例化对象user1和user2访问的是同一组属性和方法。
备注:创建一个新函数,就会根据特定规则为这个函数创建一个prototype属性,这个属性指向函数的原型对象。
6.混合模式----》构造函数模式+原型模式
通过构造函数定义实例属性,通过原型定义方法和共享属性,如下所示:
function createObj(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
createObj.prototype.method = function() {
alert(this.name);
}
var user1 = new createObj("cqs",11,"男")
7.面向对象继承
将原型链作为实现继承的主要方法,其基本思路就是利用原型让一个引用类型继承另一个引用类型的方法和属性。
概念:每个构造函数都有一个原型对象