SOURCE

// 类的原型对象 prototype 
// 类的原型 __proto__ 

// function A() {
//     this.id = 1
// }
// A.prototype.name = [1]
// A.prototype.type = 'x'
// A.prototype.getId = function() {
//     return this.id
// }
// function B() {

// }

// const a = new A() // a.__proto__ = A.prototype 将实例的__proto__指向类的prototype

// B.prototype = a // B.prototype = a.__proto__

// var b = new B() 

// console.log(b.getId()) // 子类实例可访问到父类原型的方法
// console.log(b.id) // 子类实例可访问到父类实例的属性

// // instanceof通过原型链判断,b 是 B的实例,而 B.prototype = A.prototype,所以 b是A的实例
// console.log( b instanceof B )
// console.log( b instanceof A )
// console.log( B instanceof A ) // 此处是将A的实例赋值给B的原型对象实现继承效果,而不是B类,所以应该是B的原型对象继承了A
// console.log( B.prototype instanceof A ) 


// const b1 = new B()
// const b2 = new B()
// console.log(b2.name)
// console.log(b2.type)
// b1.name.push(2) // 改变父类公共属性(引用类型)的值(内部值),会影响到其他实例
// b1.type = 'y'
// console.log(b2.name)
// console.log(b2.type)

// 组合式继承:在子类构造函数里执行父类构造函数,将子类原型对象赋值为父类实例。
// function A(id) {
//     this.id =id
//     this.name = 'zhang gong'
// }
// A.prototype.getId = function() {
//     return this.id
// }
// function B(id) {
//     A.call(this,id)
// }
// B.prototype = new A()
// const b = new B(1)
// console.log(b.id)

// 原型式继承:类继承的封装
// function C(o) { // o是父类实例
//     function F() {}
//     F.prototype = o;
//     return new F();
// }
// const c = new C(new A(2)) // C里没有给this添加属性或方法,所以new C()效果与C()一样
// console.log(c.id)

// 寄生式继承:原型式继承的封装
// function createC(obj) { // obj是父类实例
//     var o = new C(obj);
//     o.getId = function() { // 给子实例添加新方法
//         return 2
//     }
//     return o;
// }

// console.log(new C(new A(1)))


// function D(child,parent) {
//     // p既不是父类实例,也不是子类实例,它的构造器是子类
//     var p = C(parent.prototype) // 复制一份父类的原型副本保存在变量,约等于父类实例
//     p.constructor = child // 修改假父类实例(p)的构造器为子类构造器
//     child.prototype = p // 类式继承:子类原型对象 = 假父类实例;
//     // child.prototype = 的副作用:child.constructor = p.constructor
// }

// function A(id) {
//     this.id = id
// }
// A.prototype.getId = function() {
//     return this.id
// }
// function B(id) {
//     A.call(this,id) // 构造函数式继承
//     this.time = 500
// }
// // B.prototype = new A() // 类式继承
// Cy(B,A)
// const b = new B(3)

// console.log(b.id)
// console.log(b.name)

// function C(o) {
//     const f = function() {}
//     f.prototype = o
//     return new f() // 原型式继承
// }
// function Cx(o) {
//     var f = new C(o) // 寄生式继承
//     f.name = 'my'
//     return f
// }
// function Cy(child,parent) { // 寄生组合式继承
//     var p = Cx(parent.prototype) // 复制父类的原型对象
//     p.constructor = child // 修改复制对象的构造函数
//     child.prototype = p // 复制对象赋值给子类的原型对象(类式继承)
// }

// 继承单个对象的属性
var extend = function(target,source) {
    for(var property in source) {
        target[property] = source[property]
    }
    return target
}

var extendMuit = function() {
    let target = arguments[0],
        len =  arguments.length,
        i = 1,
        currentObj;
    for(; i<len; i++) {
        currentObj = arguments[i]
        for(let property in currentObj) {
            target[property] = currentObj[property]
        }
    }
    return target
}

Object.prototype.extendMuit = function() {
    var len = arguments.length,o,i=0;
    for(; i<len; i++) {
        o = arguments[i];
        for(let p in o) {
            this[p] = o[p]
        }
    }
}

var a = {}
a.extendMuit({aa:1},{bb:2})
console.log(a)
console 命令行工具 X clear

                    
>
console