参考jsliang,手打一遍加深记忆~
1.创建对象
工厂模式
function factory(name){
var o=new Object();
o.name=name;
return o
}
构造函数
function Person(name, age) {
this.name = name;
this.age = age;
this.eat = function () {
console.log(`${name}年龄是${age}`)
}
}
原型模式
function Person(name, age) {
}
Person.prototype.name="zhao"
2.对象继承
构造函数继承
知识点: proto prototype new apply call
1.搞个构造函数继承
2.在构造函数的原型上定义一个方法,这样子就可以函数的实例化对象就可以有原型上的方法啦。
Person.prototype.eatPro = function () {
console.log(`${this.name}年龄是${this.age}`)
}
3.测试是否结果正确
var aa = new Person("xiaowang", 15)
var bb = new Person("甜甜", 15)
aa.eatPro()
bb.eatPro()
console.log(aa.eatPro() === bb.eatPro())
为什么要在原型上定义方法而不是在构造函数中定义方法呢?因为实例化对象中调用每个方法会产生内存,占用空间。原型上直接定义就可以解决这个问题。
借用构造函数继承
function SuperType(){
this.colors=['red','green']
}
function subType(){
SuperType.call(this)
}
var c=new subType()
c.colors.push('black')
console.log(55,c) //55,{"colors":["red","green","black"]}
new做了什么?
new主要做的就是返回一个对象,对象的_proto_属性指向构造函数实例的原型。
new的操作: 1.创建一个空对象 2.空对象的proto属性指向构造函数的原型 3.this指向空对象
function myNew(Con,...args){
//创建一个新的空对象
let obj={}
//空对象的_proto_属性指向构造函数的原型
Object.setPrototypeOf(obj,Con.prototype)
//this指向空对象
let res=Con.apply(obj,args)
return res instanceof Object?res:obj
\
}