/*
①构造函数的prototype属性 其实是指向一个对象 我们也称之为原型对象
②原型对象中包含在原型对象中定义的各种共享属性和方法.除此之外,还有一个constructor属性.它指向构造函数
③实例对象的__proto__属性也指向构造函数的原型对象
④当一个实例中,调用没有的属性和方法时,会沿着__proto__链找到原型对象,如果原型对象有则调用.如果没有,则会继续
沿着构造函数原型对象的__proto__向上查找.最终查找到Object.prototype.如果Object.prototype也没有,则返回null
⑤isPrototypeOf() 判断某个proptotype对象和某个实例之间的关系
⑥hasOwnProperty() 判断某一个属性到底是本地属性,还是继承自prototype对象的属性
*/
function Person() { } //构造函数
Person.prototype.age = 18
const p = new Person() //p是实例对象
console.log(p.age);
console.log(Person.prototype); //构造函数的prototype指向原型对象
console.log(p.__proto__); //实例的__proto__也指向原型对象(和上面的构造函数的原型对象是同一个对象)
console.log(p.__proto__ === Person.prototype); //输出true.实例的__proto__和构造函数的prototype指向的是同一个原型对象
console.log(Person === Person.prototype.constructor);//输出true. 原型对象的constructor指向关联的构造函数
console.log(Object.prototype.__proto__ === null); //输出true
console.log(Person.prototype.isPrototypeOf(p)); //输出true
console.log(p.hasOwnProperty("age")); //输出false
/*
注意下面两种写法:
Person.prototype.age = 18
Person.prototype = { age:18 }
上面两者是由本质区别的,第二种会破坏原型对象.因为系统生成的原型对象是含有constructor这个属性的
-------------------
这是很重要的一点,编程时务必要遵守。下文都遵循这一点,即如果替换了prototype对象
o.prototype = {};
那么,下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数
o.prototype.constructor = o;
*/
网友评论