原型式继承,是一种不涉及构造函数的继承方法,能够通过原型实现对象之间的数据共享
其基本原理所形成的代码是:
function object(o) {
function F() {}
F.prototype = o
return new F()
}
object()函数,接收一个对象,函数内部产生一个临时构造函数,把传入的对象赋值为临时构造函数的原型,返回一个临时构造函数的实例,本质上是浅复制了一下传入的这个对象,然后返回了一个影分身.
举个例子
// 定义一个忍者对象
let Naruto = { name:'漩涡鸣人', skill: ['螺旋丸'] }
// 生成一个分身,然后分身学会了技能,并且传回了本体
let fenShen1 = object(Naruto)
fenShen1.name = '鸣人一号'
fenShen1.skill.push('雷切')
// 又生成了一个分身,学会了另一个技能,传回本体
let fenShen2 = object(Naruto)
fenShen2.name = '鸣人二号'
fenShen2.skill.push('尾兽玉')
// 本体就学会了这两个技能,并且以后这两个分身也能使用了
console.log(Naruto) // { name:'漩涡鸣人', skill: ['螺旋丸', '雷切', '尾兽玉'] }
console.log(fenShen1.skill[2]) // '尾兽玉'
ES5添加了Object.create()方法,规范了原型式继承.Object.create()接收两个参数,第一个是传入的对象,第二个是可选参数,,返回的对象添加属性.
举个例子
// 定义一个忍者对象
let Naruto = { name:'漩涡鸣人', skill: ['螺旋丸'] }
// 生成一个分身,然后分身学会了技能,并且传回了本体
let fenShen1 = Object.create(Naruto)
fenShen1.name = '鸣人一号'
fenShen1.skill.push('雷切')
let fenShen2 = Object,create(Naruto,{hair: {value: 'yellow'}})
fenShen2.name = '鸣人二号'
fenShen2.skill.push('尾兽玉')
// 可以看到分身二号添加了头发属性
console.log(fenShen2.hair) // yellow
适用场景是:对象之间需要共享数据,但是又不需要创建构造函数的时候