Object构造函数模式
方法:先创建Object对象,再动态添加属性/方法
适用场景:起始时不确定对象内部数据
缺点:语句太多
var p = new Object();
p.name = 'Tom';
p.age = 12;
p.setName = function(name){
this.name = name
};
对象字面量模式
方法:使用{}创建对象,同时制定属性、方法
适用场景:起始时对象内部数据是确定的
缺点:如果创建多个对象,有重复代码
var p = {
name:'Tom',
age:12,
setName:function(name){
this.name = name;
}
};
工厂模式:
方法:通过工厂函数动态创建对象并返回
适用场景:需要创建多个对象
缺点:对象没有一个具体的类型,都是Object类型
工厂函数:返回一个对象函数,称为工厂函数
function createPerson(name age){
var obj = {
name:name,
age:age,
setName:function(name){
this.name = name;
}
}
}
自定义构造函数模式
方法:自定义构造函数,通过new创建对象
适用场景:需要创建多个类型确定的对象
缺点:每个对象都有相同的数据(方法,因此可以将方法放在原型上),浪费内存
function Person(name,age){
this.name = name;
this.age = age;
this.setName = function(name){
this.name = name;
}
}
Person.prototype.setName = function(name){
this.name = name;
}
继承
原型链继承
方法:
- 定义父类型构造函数
- 给父类型的原型添加方法
- 定义子类型的构造函数
- 创建父类型的对象赋值给子类型的原型
- 将子类型原型的构造属性设置为子类型
- 给子类型原型添加方法
- 创建子类型对象,可以调用父类型的方法
注意点:
子类型的原型为父类型的一个实例对象
function Super(){
this.supProp = 'Supper property';
}
Super.prototype.showSupperProp = function(){
console.log(this.supProp)
}
function Sub(){
this.subProp = 'Sub property';
}
Sub.prototype.showSubProp = function(){
console.log(this.subProp);
}
Sub.prototype = new Super();
Sub.prototype.constructor = Sub();
Sub.prototype.say = function(){
console.log('say')
};
借用构造函数继承
- 定义父类型构造函数
- 定义子类型构造函数
- 在子类型构造函数中调用父类型构造
注意点:
在子类型构造函数中用call()调用父类型构造函数
function Person(name,age) {
this.name = name;
this.age = age;
}
function Student(name,age,address) {
Person.call(this.name,age);
this.price = address;
}
var st = new Student('da',20,'daf');
console.log(st);
组合继承:
原型链 + 借用构造函数的组合继承
- 利用原型链实现对父类型对象方法的继承
- 利用call()借用父类型构造函数初始化相同属性
function Person(name,age) {
this.name = name;
this.age = age;
}
Person.prototype.setName = function (name) {
this.name = name;
}
function Student(name,age,price) {
Person.call(this.name,age);
this.price = price;
}
Student.prototype = new Person();
Student.prototype.constructor = Student;
Student.prototype.setPrice = function (price) {
this.price = price;
};
var st = new Student('da',20,'daf');
console.log(st);