一、面向对象概念
面向过程(函数式):会把整个开发分为若干的步骤,一步一步的去开发完成功能。不理于多人协作开发
面向对象:会把一切的数据都看做对象
对象:
属性 变量 特点,特性 名词
方法 函数 功能 动词
实例:实例和对象之间的关系,人和你的关系。
类:es5中没有类(class) 类是对象的模板
面向对象特点:
继承 子类(派生类) 父类(基类,超类)
多态
封装
JavaScript也是一种面向对象的编程语言。
二、对象的创建
1.JavaScript内置对象:
Array Date Function Object String Boolean Number Math RegExp…
2.自定义对象
Object 对象 用户可以根据Object对象来创建自己所需要的个性化的对象
3.自定义对象的常见方法
1)new Object();//实例化
//创建一个人对象
var person=new Object();
person.name='王大锤';
person.age=30;
//添加方法
person.run=function(){
console.log(this.name+" 跑的飞快.....");
};
person.say=function(){
console.log(this.name+" 滔滔不绝");
};
person.run();
person.say();
2)工厂函数创建对象
上面的自定义对象,简单易懂好用,若要批量创建对象,则比较麻烦,所以,批量创建对象可以使用工厂函数
//创建对象
function createPerson(name, age) {
var person = new Object();
person.name = name;//person.name中name与=后的name没有任何关系。一个是属性一个变量
person.age = age;
//添加方法
person.run = function () {
console.log(this.name + " 跑的飞快.....");
};
person.say = function () {
console.log(this.name + " 滔滔不绝");
};
return person;//返回创建的这个对象
}
优点:可以批量创建对象
缺点:会为每一个对象都添加方法, 内存的浪费
3)字面量的形式创建对象(json)
var obj = {
"name": "jack",
age: 99,
say: function () {
console.log(this.name + "'哈哈哈'");
},
walk: function () {
console.log(this.name + "走路.....");
}
};
注意:不能大批量创建对象。属性名可以使用””包裹,也可以不使用(一般不用)
4)构造函数创建对象
//构造函数
function Student(name, age, no) {
this.name = name;
this.age = age;
this.no = no;
this.test = function () {
console.log(this.name + "考试中.....");
};
}
构造函数特点:
A.构造函数的名称首字母需要大写(目的是为了与普通函数区分开)
B.构造函数中没有显示的创建对象(new Object())
C.将所有的属性和方法都赋值给了this
D.没有return语句,也没有返回对象
E.必须通过new运算符来调用
new运算符的功能:
A.创建一个新对象
B.会将构造函数的作用域赋给新对象(this就指向了这个新对象)
C.返回新对象
弊端: 依然会为每一个新对象创建新方法 内存浪费
5)原型来创建对象
function Student() { }
//将属性和方法都添加到原型中
Student.prototype.name = 'jack';
Student.prototype.say = function () {
console.log(this.name + " 在说话.....");
};
优点:
弊端:无法通过传参来解决对象实例的个性化问题
6)混合模式创建对象(原型+构造函数)
在构造函数中完成属性的绑定
在原型中完成方法的添加
function Student(name,age,no){
this.no=no;
this.age=age;
this.name=name;
}
//将方法添加到原型中
Student.prototype.say=function(){
console.log(this.name+" 在说话....");
}
Student.prototype.walk=function(){
console.log(this.name+" 走路....");
};
7)动态混合模式
三、原型对象
1.prototype
任何对象都有原型对象(prototype)
原型对象中内容,对对象实例来说都是公共的
打印对象的实例,发现对象实例有一个__proto__属性:
console.log(Student.prototype==s1.__proto__);//true
对象实例的__proto__指向对象的原型。
2.constructor
原型对象有一个属性 constructor,该属性指向构造函数
四、call和apply
this在不同的地方指向不同的对象,通过call和apply方法可以修改this的指向,可以让它指向指定的对象。call和apply的功能一致
只有函数才可以调用call和apply
1)call
call(obj,item,item…)
参数说明:
obj: 修改之后this要指向的对象
后面的参数,就是传递给指定函数的参数
2)apply
apply(obj,数组);
obj:修改后this要指向的对象
数组参数:要传递给函数的参数
示例:修改this指向:
function fn() {
console.log(this);
}
// window.fn();
var obj = {
name: 'jack',
age: 20
};
// obj.say();
// fn.call(obj);//this 指向obj
上面代码中,原本普通调用时,函数中的this应该指向window,通过call改变了this的指向。如果函数是有参数的,则函数的第一个参数是this的指向,剩下的参数照常写。
示例:求数组的最大值
var arr = [10, 20, 100, 5];
// var m=Math.max(arr);
var m = Math.max.apply(Math, arr);
console.log(m);
示例:对象
function Person(name,age){
// console.log(this);
this.name=name;
this.age=age;
}
function Student(name,age,no){
// Person.call(this,name,age);//对象冒充
Person.apply(this,[name,age]);
this.no=no;
}