定义一个函数 test
function test (){
this.age = 10
}
prototype 函数的一个属性 我们可以理解为 函数的原型属性
test.prototype
object对象,自带一个__proto__属性 (指针)
举例 new 关键字实例化对象
let a = new test()
a 是一个实例化的对象 test这个时候,就是实例化a对象的构造函数
当我们打印
console.log(a)
输出的结果是
{
constructor :fn test(),
__proto__
}
constructor 对应的值就是test()构造函数
a.__proto__ === test.prototype
a的指针 等于我们test构造函数的 prototype(原型属性)
实例对象 a 它的原型就是我们test构造函数的prototype(属性)
test.prototype 他虽然是 a 实例的原型 但是他本身也是一个对象
{
constructor :fn Object(),
__proto__
}
他也拥有__proto__ 指针 __proto__指向的是函数test 自己的原型 object.prototype
为什么这么讲
consturctor 这个构造器的值 就是一个fn函数 Object
当我们输出cosnole.log(test.prototype.__proto__) 的结果时
{
constructor:fn Object()
}
但是这个{ } 中是没有 __proto__ 属性的 也就是说这个是我们这个原型链上的最上级
当你输出 object.prototype.__proto__ 时 返回的值为null
实例 a.__proto__ === test.prototype
test.prototype.__proto__ === object.prototype
a 的原型是 test.prototype
test 的原型是 object.prototype
他们之间都通过 __proto__ 进行链接
就形成了原型链的关系
test函数中有一个值 为this.age = 10
这个属性会被保存到test.prototype属性中
而a对象是通过new test() 得到的,那么a实例拥有age属性
console.log(a.age)
这个是通过原型的关系实现的继承就叫原型继承
object.prototype.name = '小铭'
console.log(a.name)
这种就是通过原型链实现的继承 __proto__
实例a 在 test.prototype 中没有找到name
但是在 test.prototype.__proto__指向的object.prototype 属性中找到了name值
实例和属性值之间存在间接的关联 这种属于原型链的继承
判断一个属性是否在实例中可以使用
console.log(a.hasOWNproperty('name')) 如果这个属性在实例上 就返回true 否则返回false
判断一个属性是否在实例的原型链上面使用
console.log('name' in a) 如果在原型链上返回true 否则返回false
```