1 定义一个方法 方法只有被New 的时候才能成为是构造函数 否则不能确定 该方法是否是构造函数
function test() {
console.log('eeeee')
}
console.log(test)
2 构造函数都有一个属性prototype,这个属性是一个对象(Object的实例)
function test() {
console.log('eeeee')
}
let Test = new test()
console.log(Test)
打印 test 的实例对象 Test 看到如下结果 constructior 很容易看出来它是(也是一指针)指向的是构造函数 test 那么 问题来了 _proto_是什么 ?? 接着往下看
每个persion共有的属性就是他的性别都是男,所以我们可以将此属性添加到实例的原型对象中去(也就是Man这个构造函数里面的prototype这个对象)。这样每个实例都可以共享这个属性。
他的实例对象可以共享这个属性,那我们怎么将实例对象和原型对象关联起来呢?在js中,任何对象都有一个属性叫__proto__([[prototype]]),它也是一个指针,指向构造函数的原型对象,就是我们所能共享信息的那个对象。现在我们可以画出一幅图,展示他们之间的关系。
每一个实例对象 (Persion1 Persion2 ) 中都有一个_proto_ 这个也是一个指针 指向的是 该实例对象的构造函数所在内存的地址, 等于 这个实例对象的原型对象 等于 Man构造函数的Prototype(指针)对象 所指向的地址
指向的都是同一块的内存地址
function Man() {}
Man.prototype.sex = '男'
let Person1 = new Man()
let Person2 = new Man()
console.log(Man, Person1, Person2)
大概的流程图 如下
总结
1、原型链
1)构造函数、原型和实例的关系
①构造函数都有一个属性prototype,这个属性是一个对象(Object的实例)
②原型对象prototype里面有一个constructor属性,该属性指向原型对象所属的构造函数
③实例对象都有一个_proto_属性,该属性也指向构造函数的原型对象,它是一个非标准属性,不可以用于编程,它是用于浏览器自己使用的
2)prototype与_proto_的关系
①prototype是构造函数的属性
②_proto_是实例对象的属性
——这两者都指向同一个对象
【总结】i)函数也是对象,对象不一定是函数;
ii)对象的本质:无序的键值对集合;键值对当中的值可以是任意数据类型的值
iii)对象就是一个容器,这个容器当中放的是(属性和方法)
3)属性搜索
①在访问对象的某个成员的时候会先在对象中找是否存在
②如果当前对象中没有就在构造函数的原型对象中找
③如果原型对象中没有找到就到原型对象的原型上找
④知道Object的原型对象的原型是null为止
2、Function
——所有函数都是Function的实例