原型和继承包
原型基础
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
}