JS实现继承的多种方式(二)

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

                                             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值