目录
问题2:Person.prototype 的 __proto__ 指向谁?
问题4:Object.prototype 的 __proto__ 指向谁?
问题6:Function.prototype 的 __proto__ 指向谁?
一、原型
原型解决的问题
当我们需要给实例对象添加方法时,直接在构造函数体内直接向实例对象添加方法,这种行为并不好,原型就是解决这一问题的。
不好的原因:当把方法书写在构造函数体内,每次创建实例的时候,都会创建一个函数数据类型,多个函数方法,一模一样,就会占据多的存储空间。
比如:
<script>
function Person(name, age) {
//向实例对象内添加属性
this.name = name
this.age = age
//向实例对象内添加方法
//在构造函数体内直接向实例对象添加方法,这种行为并不好
this.sayHi = function () { console.log('hello') }
}
//创建两个实例
var p1 = new Person('jack', 18)
var p2 = new Person('Pose', 20)
console.log(p1)
console.log(p2)
console.log(p1.sayHi === p2.sayHi) //false
</script>
原型概念
每一个函数天生自带一个 prototype 属性,是一个对象数据类型。当函数出现的时候,就会产生prototype;每一个对象天生自带一个属 __proto__,指向所属构造函数的prototype;当你访问对象成员的时候,首先在自己身上查找,如果没有,自动去到__proto__上查找。
<script>
function Person() {}
Person.prototype.a = 100
Person.prototype.b = 200
console.log(Person.prototype)
//创建一个实例对象
//p1所属的构造函数就是 Person
//p1.__proto__ === Person.prototype
var p1 = new Person()
console.log(p1.__proto__ === Person.prototype) //true
//当你访问 p1 的 a 成员时,自己没有,就会自动去自己的 __proto__ 上查找
//而自己的 __proto__ 就是 Person.prototype,所以其实就是去到Person.prototype上查找
console.log(p1.a)
</script>
因此,原型解决问题问题的方式就是 把需要添加给实例的方法&