OO: 类的概念, 通过类创建多个具有相同属性和方法的对象
封装 继承 多态
(1) 构造函数-> 创建对象
构造函数虽然首字母要大写,但是还是函数,只不过是用来创建对象的。
构造函数可以创建特定类型的对象。
<script type="text/javascript">
function People(name,age){
// 名称首字母必须大写
this.name=name; // 直接将属性和方法给this对象
this.age=age;
//没有return
}
var jessica=new People("jessica",18);
var krystal=new People("krystal",20);
console.log(jessica);
console.log(krystal);
console.log(jessica instanceof People);
console.log(krystal instanceof People);
console.log(jessica instanceof Object);
console.log(krystal.constructor==People);
//构造器 指向了People
</script>
Result:
(2) * new 经历了4个步骤
eg:
var jessica=new People("jessica",18);
[1] 创建一个空的对象 var obj={}
[2] 将构造函数的作用域给新的对象 (this -> obj)
[3] 执行构造函数的代码 (属性和方法给obj)
[4] return obj
(3) 可以创建对象也可以是普通函数
[1] new出现了就是创建一个新obj
[2] 普通
function People(name,age){// 名称首字母必须大写
this.name=name; // 直接将属性和方法给this对象
this.age=age;
//没有return
this.say=function(){
return this.name+":"+this.age;
}
}
People("ljy",18);
window.say();
(4) 构造函数的优点+缺点
优点:
创建对了相似对象(大量的实例化), 也解决了工厂模式的对象识别问题(这个对象是谁创建的, 对象的类型), 因为构造函数可以创建特定类型对象。
缺点:
上面例子说明, jessica和krystal都有共同函数say(), 但是每次new 都要创建一个新的say(), 每次都创建相同的任务是没有必要的
缺点解决:
[1] 将共同的属性或方法转移到全局下
function People(name,age){
this.name=name;
this.age=age;
this.say=say;
}
function say(){
return this.name+":"+this.age;
}
问题:
虽然解决了问题, 但是此时作用域是在global下, 并且没有封装 [2] 解决了这个问题
[2] prototype 原型的概念
详见下一节