js原型关系详解与属性继承实例
User.protype 是显示原型属性,只有函数才有
隐式原型属性指向自己缔造者的原型对象
<script>
//原型属性才分为显示原型属性(prototype)和隐式原型属性(__proto__),但是原型对象只有一个
//prototype中文:原型
console.log(
"--------下面的代码证明了函数的缔造者也是Object.prototype(对象原型)------"
);
// 一个函数对象结构
function User() {}
console.dir(User); //ƒ User(),这个函数身上才有prototype(显示原型属性)
//函数的隐式原型是ƒ anonymous(),ƒ anonymous()是一种类型,匿名函数类型
console.dir(User.__proto__);
//说明函数的隐式原型ƒ anonymous()也是一个对象
console.dir(User.__proto__.__proto__); //ƒ anonymous()的缔造者是
console.dir(User.__proto__.__proto__ == Object); //false
//匿名函数实例的隐式原型对象指向自己缔造者的原型对象所以
console.dir(User.__proto__.__proto__ === Object.prototype); //true
//上面的匿名函数实例的缔造这个就是Object原型对象
//-----------------------------------------------------------------
console.log(
"--------函数对象实例的隐式原型属性 和 函数的显示原型属性指向一个东西------------------------------------------"
);
let hd = new User(); //函数对象实例
console.log(hd.__proto__);
console.dir(User.prototype);
console.dir(User.prototype === hd.__proto__);
//实例对象一般会顺着隐式原型属性向上找东西
console.log(
"-----------------------------------------------------------------"
);
//所有对象的隐式原型属性的最终是Object.prototype
console.dir(Object.prototype.__proto__); //null 对象原型的缔造是null
console.log(
"-----------------------------------------------------------------"
);
console.dir(User.prototype); //Object
console.dir(Object.prototype); //Object
console.dir(User.prototype == Object.prototype); //Object
//函数的原型属性是对象
console.dir(User.prototype.__proto__ === Object.prototype); //true
//函数的显示原型属性里面有一个构造函数constructor,constructor又是一个函数,一致循环下去
console.dir(User.prototype.constructor); //ƒ User()
console.dir(User.prototype.__proto__ === Object.prototype); //true
console.dir(User.__proto__); //ƒ anonymous()
//匿名函数类型也是一个对象
console.dir(User.__proto__.__proto__);
// // new 一个函数对象
// let hd = new User();
// console.log(hd);
// console.dir(User);
// let ob = new Object();
// console.dir(Object);
// console.dir(Object.__proto__);
// console.dir(Object.prototype === Object.__proto__);
// let arr = [];
// console.dir(arr);
// console.dir(Array.prototype);
</script>