// 工厂模式
function setObj(name, age) {
var obj = {
name: name,
age: age,
setName: function(name) {
this.name = name
console.log(this.name);
console.log(this);
}
}
return obj
}
var result = setObj('wangwu', 18)
console.log(result.name);
result.setName('zhangshan')
// 定义构造函数模式混合原型
function Person(name, age) {
this.name = name;
this.age = age
}
Person.prototype.setName = function(name) {
this.name = name
}
var p1 = new Person('xiaoli',18)
var p2 = new Person('xioahong', 19)
console.log(p1,p2);
对象创建模式:
- 工厂模式:返回一个对象的函数,就是工厂函数;适用场景:需要创建多个对象;问题:对象没有一个具体的类型,都是object类型;
- 自定义构造函数模式:通过new创建对象;适用:需要创建多个确定的对象;问题:每个对象都是相同的数据,浪费内存;
- 原型组合模式:构造函数中只初始化一般函数,将方法挂载在原型上;
// 父
function Supper() {
this.supProp = 'supper prototype'
}
Supper.prototype.showSupperProp = function() {
console.log(this.supProp);
}
// 子
function Sub() {
this.subProp = 'Sub prototype'
}
// 子类的原型成为父类的实例对象
Sub.prototype = new Supper();
Sub.prototype.constructor = Sub
Sub.prototype.showSubProp = function() {
console.log(this.subProp);
}
var sub = new Sub()
sub.showSupperProp()
sub.showSubProp()
console.log(sub.toString);
console.log(sub.constructor);
// 借助构造函数
function Person(name, age) {
this.name = name
this.age = age
}
function Student(name, age, price) {
Person.call(this, name, age)
this.price = price
}
var s = new Student('zhangsan',18,1000);
console.log(s.name, s.age, s.price);
// 完整继承
function Fu(name, age) {
this.name = name
this.age = age
}
Fu.prototype.setName = function(name) {
this.name = name
}
function Zi(name,age,price) {
Fu.call(this, name, age)
this.price = price
}
Zi.prototype = new Fu();
Zi.prototype.constructor = Zi
Zi.prototype.setPrice = function(price) {
this.price = price
}
var zi = new Zi('xiaoxuesheng', 12, 199999);
console.log(zi.name, zi.age,zi.price);
zi.setName('haunyige');
zi.setPrice('9999')
console.log(zi.name, zi.age,zi.price);
原型链继承:
- 要实现子类(构造函数)的原型成为父类(构造函数)的实例对象,这样,子类就可以使用父类原型上的属性方法;
- 最终需要让子类的(实例对象)原型中的constructor指向自己(构造函数);
- 借用构造函数继承(假):定义父类构造函数、子类构造函数,在子类构造函数中调用父类构造;关键:在子类中用call()调用父类构造函数;
- 组合:原型链+借用构造阿含糊的组合继承;1.利用原型链实现对父类对象的方法继承;2.利用call()借用父类函数初始化相同属性;