4. 原型式继承
借助原型中已有的对象创建新对象,同时不必因此创建自定义类型
function object(params) {
function F() {}
F.prototype = params // 初始化实例的值
return new F() // 继承Object
}
var penson = {
name: "yun",
friend: ["touda"],
sayName: function () {
console.log(this.name)
}
}
var creatPenson = object(penson)
var creatPensons = object(penson)
creatPenson.friend.push("liu")
console.log(creatPenson.friend) // -> ["touda", "liu"]
creatPenson.sayName() // -> yun
console.log(creatPensons.friend) // -> ["touda", "liu"]
即通过一个函数Bus用来获取对象原型属性(Object),以参数的信息来初始化当前实例的值(即对penson进行一次浅复制, 但受其引用影响),ES5规范化 Object.creat
var creatPenson = Object.create(penson)
var creatPensons = Object.create(penson, {
name: { // 覆盖同名属性
value: "touda"
}
})
console.log(creatPenson)
console.log(creatPensons.name) // -> touda
缺陷: 构造从属关系,全局共享实例属性
优点: 小众型继承
5.寄生组合式继承
通过构造函数来继承属性,通过原型链的混成形式来继承方法
// 综合方法
function inheritPrototype(subType, superType) {
var prototype = Object.create(superType.prototype) // 继承基础Object及共用方法
prototype.constructor = subType // 指定构造函数(弥补失去默认的constructor属性)
subType.prototype = prototype // 原型初始化(包括其构造函数)
}
// 存储通用属性
function SuperType(name) {
this.name = "yun"
this.friend = ["touda", "liu"]
}
// 父类公用方法
SuperType.prototype.getLast = function () {
return this.friend[this.friend.length - 1]
}
// 实例化属性
function SubType(){
SuperType.call(this)
this.onlyOwnMe = true
}
inheritPrototype(SubType, SuperType)
var instance = new SubType()
var instance2 = new SubType()
instance.friend.push("west")
console.log(instance.getLast()) // -> west
console.log(instance2.getLast()) // -> liu