原型与原型链
__proto__
原型链,prototype
(原型对象),所有的JavaScript
对象都会从一个prototype
(原型对象)中继承属性和方法。- 每个函数都有一个
prototype
属性,可以称之为显式原型属性。 - 每个对象的实例对象都有一个
__proto__
属性,可以称之为隐式原型属性。 - 实例对象的隐式原型的值和其构造函数的显式原型的值所对应。
//每一个函数都有自己的prototype也就是显示原型
//每一个对象的实例对象都有自己的原型链__proto__也就是隐式原型
//实例对象的隐式原型的值指向函数的显示原型的值
function A(name){
this.name = name
}
var B = new A()
B.__proto__ === A.prototype
来几道笔试题加深理解
// 定义构造函数
function C () {
}
function D () {
}
// 实例化一个 o 对象
var o = new C()
// true,true --> C.prototype 在 o 的原型链上
console.log(o instanceof C, o.__proto__ === C.prototype, '此时 o 的 __proto__:', o.__proto__, '此时 C 的 prototype:', C.prototype)
// false,false --> D.prototype 不在 o 的原型链上
console.log(o instanceof D, o.__proto__ === D.prototype)
// true true --> Object.prototype 在 o 的原型链上
console.log(o instanceof Object, o.__proto__.__proto__ === Object.prototype)
// 这时我们修改构造函数 C 的原型为一个空对象
C.prototype = {
}
// 实例化一个 o2 对象