1. 编程思想
面向过程(POP):更加注重过程,分布执行;分析解决问题所需要的步骤,依次执行,先具体,再整体
面向对象(OOP):关注的是整体,按照模块执行;把构成问题的事务分解成对象,描述这些对象的行为,先整体,再具体
2. 创建方式
1.字面量创建
var stu1 = {
name:"li",
age:18,
sayHallo:function (){
console.log(this.name);
}
}
缺点:代码冗余
2.借助内置构造函数创建
var stu1 = new Object();
stu1.name = "caicai";
stu1.age = 20;
stu1.sayHello = function(){
console.log(this.name);
}
缺点:代码冗余
3.通过工厂函数创建
function createObj(name,age){
var obj = new Object();
obj.name = name; //属性
obj.age = age;
obj.sayHello = function(){ //方法
console.log(obj.name);
}
return obj;
}
var stu1 = createObj("cai",22);
var stu2 = createObj("xu",21);
缺点:无法判断对象所属哪个类
4.构造函数方式创建
function Person(name,age){ //构造函数
//添加两个属性 一个方法
this.name = name;
this.age = age;
this.sayHello = function(){
console.log(this.name);
}
}
// 创建两个实例
var person1=new Person("john1",21);
var person2=new Person("john2",22);
构造函数运行机制
1.创建一个新对象
2.改变this指向(指向新对象)
3.执行构造函数里的代码
4.返回这个新对象
5.组合创建
属性放在构造函数里,方法放在原型对象里
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function(){ //原型方法
console.log(this.name);//this也是指向实例
}
var person1 = new Person("john1",21);
var person2 = new Person("john2",22);
3. 原型对象
原型对象:每个函数都有的一个属性 prototype
原型对象上的属性和方法都能被实例所访问
function Person(){
}
//给原型对象添加属性和方法
Person.prototype.name = "kk";
Person.prototype.age = 20;
Person.prototype.sayHello = function(){
console.log(this.name);
}
var person1 = new Person();
var person2 = new Person();
constructor属性:原型对象的默认属性,用来引用它的函数对象
function Foo(){
}
console.log(Foo.prototype);
console.log(Foo.prototype.constructor);
4. 原型链
每一个构造函数都有一个原型对象,每一个原型对象上都有一个指向构造函数的指针(constructor),每一个实例上有指向这个原型对象的内部指针__proto__,原型对象上的属性和方法能被实例所访问到
function FnA(){
this.a = "aa";
}
function FnB(){
this.b = "bb";
}
function FnC(){
this.c = "cc";
}
FnB.prototype = new FnC(); //让FnB原型对象具有c属性
var fb = new FnB();
console.log(fb.c);//cc
FnA.prototype = new FnB();//让FnA原型对象里具有b属性
var fa = new FnA();
console.log(fa.b);
console.log(fa.c);