这是我参与更文挑战的第15天,活动详情查看:更文挑战
基本概念
-
构造函数:new后面跟着的函数、
constructor
属性 -
原型、原型对象 :
[构造函数].prototype
-
实例的私有属性、内部指针:
__proto__
原型链
function SuperType() {
this.property = true
}
SuperType.prototype.getSuperValue = function () {
return this.property
}
function SubType() {
this.subproperty = false
}
// 继承 SuperType
SubType.prototype = new SuperType()
SubType.prototype.getSubValue = function () {
return this.subproperty
}
let instance = new SubType()
// console.log(instance.getSuperValue()) // true
console.log(instance)
复制代码
-
对于箭头1来说,每个构造函数都有一个
prototype
属性,指向它的原型对象 -
对于箭头2来说,在new 一个实例对象的时候,会在实例对象
instance
中添加一个__proto__
私有属性,指向构造函数的原型对象,综合1与2,可以得到instance.__proto__==SubType.prototype
-
对于箭头3来说,每个原型对象里面都有一个
constructor
属性,指向它的构造函数 -
在这里,我们实现了一个简单的继承,当需要使用某个属性时,首先会从实例上查找,没有找到的话,就会去它的原型对象上查找,还没有的话,接着去原型的原型里面去找,这里想调用
instance.getSuperValue()
,查找顺序就是instance-->SubType.prototype-->SuperType.prototype,
判断类型
instanceof
instanceof是比较常见的判断类型的方法,如果一个实例的原型链中出现过对应的构造函数,那么就为true
console.log(instance instanceof Object); // true
console.log(instance instanceof SuperType); // true
console.log(instance instanceof SubType); // true
复制代码
isPrototypeOf
只要原型链中包含这个原型,这个方法就返回 true:
console.log(Object.prototype.isPrototypeOf(instance)); // true
console.log(SuperType.prototype.isPrototypeOf(instance)); // true
console.log(SubType.prototype.isPrototypeOf(instance)); // true
复制代码
默认原型
在最外层,其实还有一个默认的Object对象,它是所有对象的基础,是原型链的最末端
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END