引子
隐式原型,显式原型(原型对象),构造函数,js 蛋鸡问题
__prototype__,prototype,constructor
1.创建的对象都是有 构造函数 的,对象具有的属性__proto__指向该对象 构造函数 的原型prototype,即
XXXX.__proto__===YYYY.prototype
==》YYYY 为 XXXX 的构造函数 ==》XXXX 为 YYYY 的实例对象 ==》XXXX instanceof YYYY === true
2.函数原型为对象,函数为对象
Function.prototype.__proto__===Object.prototype
==》Object 为 Function.prototype 的构造函数 ==》Function.prototype 为 Object 的实例对象 ==》Function.prototype instanceof Object === true
==》Function instanceof Object === true
3.作为函数的顶级构造函数Function
Function.__proto__ === Function.prototype
==》Function 为 Function 的构造函数 ==》Function instanceof Function==true
综合2与3得出
Function.__proto__.__proto__ === Object.prototype
==》Object 为 Function 的构造函数 ==》Function instanceof Object === true
4.作为对象顶级构造函数Object
Object.__proto__ === Function.prototype
==》Function 为 Object 的构造函数 ==》Object 为 Function 的实例对象 ==》Object instanceof Function === true
Object.prototype.__proto__===null
==》Object.prototype.__proto__!==Function.prototype ==》Function 非 Object.prototype 的构造函数==》Object对象原型不是函数,它是空的
5.其它构造函数 Number,String,Array,Boolean
(Number|String|Array|Boolean).__proto__===Function.prototype
(Number|String|Array|Boolean) instanceof (Object|Function) === true
(Object|Function) instanceof (Object|Function) ==true
6.constructor
Object===Object.prototype.constructor
Function===Function.prototype.constructor
Number|String|Array|Boolean...
7.总结示例
let obj = {},fun=function(){}
obj.__proto__===Object.prototype,
obj instanceof Object === true;
obj instanceof Function === false;
fun.__proto__===Function.prototype,
fun.__proto__.__proto__==Object.prototype
fun instanceof Function === true;
fun instanceof Object === true;
说法:
1.一切皆对象,函数也是对象
2.对象的隐式原型__prototype__会指向其 构造函数 的显式原型prototype
3.一般对象实例和构造函数都有 隐式原型__proto__,一般对象实例的隐式原型指向Object的显式原型prototype,函数及构造函数的隐式原型__proto__则指向Function的显式原型prototype
4.函数(构造函数)的显式原型的构造函数为其本身,一般对象无显式原型
一般说原型对象是指prototype
显式原型的作用:用来实现基于原型的继承与属性的共享。
隐式原型的作用:构成原型链,同样用于实现基于原型的继承。举个例子,当我们访问obj这个对象中的x属性时,如果在obj中找不到,那么就会沿着__proto__依次查找。
obj.__proto__.__proto__.__proto__.__proto__.__proto__...形成原型链,最终找到Object.prototype
引入示例
function Person() {
}
// 原型属性
Person.prototype.name = ‘Jiang’
var person1 = new Person()
// 实例属性
person1.name = ‘J’
console.log(person1.name) // J
console.log(person1.__proto__.name) // Jiang
实例属性会屏蔽原型属性,记住只是屏蔽,不会修改