工厂模式
在工厂模式中,用函数来封装特定接口创建对象。不够灵活,每个对象创建出来都是一样的属性(难以分别对象类型)
function createObj(name,age){
var o={}
o.name=name;
o.age=age;
o.sayName=function(){}
return o;
}
var obj=createObj("huahua",21);
构造函数模式
当new一个构造函数时,主要经以下三步:
- 以构造器的prototype属性为原型,创建新对象,将引用传给this
- 通过把带有this的属性和方法添加至对象(实际相当于平常的obj[属性],添加属性,this相当于obj)。
- 返回this指向新的对象,也就是实例。
以下例子:that相当this
var name="哈士奇"
Dog.prototype.say=function(){
console.log("wangwanga")
}
function Dog(name){
//1.以构造器的prototype属性为原型,创建新对象,将引用传给that,这是隐式的
let that=Object.create(Dog.prototype)
//2.that.name就是为对象添加属性。
that.name=name;
that.run=function(){console.log("狗的品种"+this.name)}
//3.return that 返回that, 在构造函数中也是隐式的
return that;
}
var dog=new Dog("田园犬")
dog.run();
dog.say();
上面例子只是讲述了构造器属性是如何赋给实例的,没有讲如何继承了原型上的属性。
手动实现new
- 先创建一个空对象
- 将实例的的__proto__赋值到构造函数的prototype
- 将构造函数的this指向创建的实例。
function Country(name,place){
this.name=name;
this.place=place;
}
var china={};
Country.prototype.sayName=function(){
console.log(this.name,":"+this.place)
}
china.__proto__=Country.prototype;
Country.call(china,"china","亚洲");
china.sayName()
js的继承
1.构造函数绑定 使用call或apply绑定构造函数内部this。
缺点:不能够继承Animal的原型
function Animal(place){
this.spicies="动物"
this.place=place
}
function Dog(name,place){
this.name=name;
改变 Animal内部this指向,并执行(就是new Animal())
Animal.call(this,place)
}
var dog=new Dog("tom","地球")
console.log(dog)