原型
概念:每一个构造函数天生自带一个属性为 prototype 对象,是一个对象数据类型,里面可以存放对应的数据 称为显示原型 且唯一
一般把方法放在原型里,属性放在构造函数里
当自定义构造函数书写完毕后,就会有 prototype 产生
概念:每一个对象天生自带一个__
proto__
属性,也是一个对象空间,指向对象所属构造函数的prototype,称为隐式原型
function Person() { Person.prototype.a = 100; Person.prototype.say = function(){ console.log("hello"); } } var p1 = new Person(); //person找不到a,则会去构造函数的prototype里找 console.log(p1.a); //100 p1.say(); // hello console.log(Person.prototype); //判断一个对象是否指向了该构造函数的原型对象 console.log(Person.prototype.isPrototypeOf(p1));// true //创建的对象的自带属性__proto__ 指向构造函数的 prototype对象 console.log(p1.__proto__); //指向的意思就是说是同一个东西 console.log(p1.__proto__ == Person.prototype); //true console.log(p1.__proto__ === Person.prototype); //true
总结
-
实例对象的
__
proto__
是指向对应构造函数的prototype -
在实际使用中,一般不会使用
__
proto__
,而是通过__
proto__
访问对应的prototype
问题1:实例对象的 __
proto__
指向谁?
=> 指向所属构造函数的 prototype
=> p1 所属的构造函数是 Person
=> p1.__
proto__
指向 Person.prototype
问题2:(构造函数)Person.prototype 的 __
proto__
指向谁?
=> Person.prototype 是一个对象数据类型( Object )
=> 在 JS 内所有的 object 数据类型都是属于 Object 这个内置构造函数的
=> 所以 Person.prototype 属于 Object 这个内置构造函数
=> 所以 Person.prototype 的 __
proto__
指向 Object.prototype
问题3:(构造函数)Person 的 __
proto__
指向谁?
=> Person 是一个函数,函数本身也是一个对象,所以也有 __
proto__
=> 如果Person 有父类,则指向父类的原型prototype
=> 在 JS 内,所有函数都是属于内置构造函数 Function 的实例
=> 所以 Person.__
proto__
指向 Function.prototype
问题4:Object.prototype 的 __
proto__
指向谁?
=> Object.prototype 是一个对象数据类型,只要是对象,都是属于 Object 这个内置构造函数的
=> 注意:Object.prototype 在 JS 内叫做顶级原型,不在有 __
proto`__`,指向null
问题5:Object 的 __
proto__
指向谁?
=> Object 是一个内置构造函数,也是一个函数,也是一个对象
=> 在 JS 内,所有的函数都是属于内置构造函数 Function 的实例
=> Object 也是 Function 的实例
=> 所以Object.__
proto__
指向 Function.prototype
问题6:Function.prototype 的 __
proto__
指向谁?
=> Function.prototype 也是一个对象数据类型
=> 只要是对象数据类型都是 Object 的实例
=> 所以 Function.prototype 的 __
proto__
指向 Object.prototype
问题7:Function 的 __
proto__
指向谁?
=> Function 也是一个内置构造函数,也是一个函数
=> 在 JS 内,所有的函数都是属于内置构造函数 Function 的实例
=> Function 是 自己的构造函数,自己的实例对象
=> 所以 Function 所属的构造函数时Function
=> 所以 Function.__
proto__
指向 Function.prototype