原型
设计两个概念,构造函数和原型对象
js
/* Enum就是个构造函数,创建构造函数时,浏览器会自动创建了其原型对象,原型对象中的constructor指向Enum,Enum的prototype指向原型对象 */
function Enum () {
this.name = 'Enum'
}像Object,String这些都是js自带的构造函数
实例对象
实力对象的没有prototype,但有—__proto__指向原型对象
js
let e = new Enum()
e.prototype.age = 15
e.prototype // undefined
e.__proto__ // {constructor: function Enum () {}}原型链
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
instabceof 检测实例对象的原型对象在不在这个构造函数的原型链上
js
e instanceof Enum
e.__proto__ === Enum.prototypehasOwnProperty() 和 in 检测属性是否在原型链中
js
dd.hasOwnProperty('name') // true
dd.hasOwnProperty('age') // true
'name' in dd // true
'age' in dd // true
JStar