看下面的代码
<script> function Person(sex,age){ this.sex=sex; this.age=age; } // 通过原型添加方法 Person.prototype.sayHi=function(){ console.log('你好呀') } var per=new Person('男','20') // 查看实例对象 我们发现:实例对象中有两个属性,age: "20"sex: "男" // 这两个属性是通过构造函数来获取的。即__proto__ console.dir(per) // 构造函数名称 //构造函数并没有sex和age这两个属性 console.dir(Person) </script>
我们发现的现象
实例对象中有两个属性,age: "20"sex: "男"
这两个属性是通过构造函数来获取的。即__proto__
但是构造函数并没有sex和age这两个属性
我们知道:实例对象中有一个属性,即__proto__;
它也是对象,叫做原型。
但是它不是标准的原型,是浏览器使用的。
构造函数中有个属性,叫做prototype,它也是对象,叫做原型。
是标准的属性,是程序员使用的。
也就是说 __proto__或者说prototype都是原型对象
所以我们可以大胆的猜测:
console.log(per.__proto__==Person.prototype)
输出的是true
充分证明了我们说的 __proto__或者说prototype都是原型对象。
只是一个是浏览器使用一个是程序员使用
刚刚分析的是正确的哈
那么他们的构造器呢
console.log(per.__proto__.constructor==Person.prototype.constructor)
同样返回来的是true
构造函数和实例对象和原型之间的关系
var arr=new Array(10,20,30) arr.join('40') console.dir(arr);
同样的,我们在__proto__和prototype下都可以找到join方法
__proto__是浏览器使用的原型,prototype 我们程序员使用的原型
他们三者之间的关系是
1. 构造函数创建了实例实例对象
2. prototype这个属性指向的就是这个原型对象
3. constructor这个构造器指向自己构造函数
4. 实例对象本身没有eat方法,但是他有__proto__这个属性可以调用eat方法
原型对象中的方法可以被实例对象共享。[eat方法可以被共享]
5.构造函数创建了实例对象,有了构造函数也就有了原型对象
上面这几句话等价于下面的
1.构造函数可以实例化对象
2.构造函数中有一个属性叫做prototype,是构造函数的原型对象。
3.构造函数的原型对象{prototype}中有一个constructor构造器,
这个构造器是指向自己所在的原型对象所在的构造函数。
4.构造函数的原型对象prototype中的方法可以被实例对象直接访问的。
5.实例对象的原型的对象(__proto__)指向的是该构造函数的原型对象。