原型和继承包

原型基础

instanceof

a 对象的原型链上是否有 A 构造函数的 .Prototype

function A(){}
let a = new A()
console.log(a instanceof A)

isPrototypeOf()

b 对象是否在 a 对象的原型链上

let a = {} 
let b = {} 
Object.setPrototypeOf(a,b) 
console.log(b.isPrototypeOf(a))

in

"web" 属性是否在 a 对象和他的原型链上

let a = {}
let b = {web:"web3"}
Object.setPrototypeOf(a,b)
console.log("web" in a)

hasOwnProperty()

"web" 属性是否在 a 对象上

let a = {}
let b = {web:"web3"}
Object.setPrototypeOf(a,b)
console.log(a.hasOwnProperty('web'))

对象设置原型的方法

let A = {}
// 方法一
let B = Object.create(A)
B.__proto__.constructor = Object
// 方法二
let B = {}
B.__proto__ = A
B.__proto__.constructor = Object
// 方法三
let B = {}
Object.SetPrototypeOf(B, A)
B.__proto__.constructor = Object
Object.getPrototypeOf(A)

继承

function AAA() { }
function BBB() { }
// A 方案
BBB.prototype = {
    ...AAA.prototype,
    constructor: BBB,
    saShwo() { }
}
// B 方案
Object.setPrototypeOf(BBB.prototype, AAA.prototype)
BBB.prototype.saShwo = function () { }
// C 方案
BBB.prototype.__proto__ = AAA.prototype
BBB.prototype.saShow = function () { }

封装继承

function extend(sub, sup) {
    sub.prototype = Object.create(sup.prototype)
    Object.defineProperty(sub.prototype, "constructor", {
        value: sub,
        enumerable: false
    })
}

对象工厂继承

B 的方法没有放在 prototype,不实用。

function A() {
    this.a = 'aaa'
}
A.prototype.aShow = function () { }
function B() {
    const instance = Object.create(A.prototype)
    A.call(instance)
    instance.bshow = function () { }
    return instance
}