面试(JS原型,原型链,构造函数)

一.  实例、构造函数、原型和原型链之间的关系

function Person() {} // 构造函数和普通函数的创建方式一样,唯一的区别是构造函数的首写字母需要大写
console.dir(Person.prototype) // 原型(prototype)是一个对象,他和构造函数的关系就是'构造函数中有一个prototype属性,通过这个属性就能访问到原型'
let obj = new Person() // 实例(instance即通过new关键字创建出来的obj)通过'继承'也拥有了原型上的属性,'继承'这个行为是通过new操作符内部来进行实现的
Person.prototype.name = 'name'
console.log(obj.__proto__.name) // 实例(obj)通过__proto__可以直接访问到原型(prototype),也就可以拿到原型(prototype)上的属性和方法
console.log(Person.prototype.constructor) // 同理,既然构造函数可以通过prototype访问到原型,那么原型也就可以通过constructor来访问到构造函数
console.log(obj.name) // 如果实例(obj)想要访问属性(如name属性),但是这个属性自己并没有,他就会通过__proto__去逐级网上寻找,直到找到或者找不到(null)
备注(js中所有的对象和方法都有自己的原型,但是唯独(Object.create(null)是没有的,没有继承任何原型方法,也就是说它的原型链没有上一层))

面试(JS原型,原型链,构造函数)

 

上一篇:Python-面向对象 (二 继承)


下一篇:深拷贝和浅拷贝的区别