VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > JavaScript教程 >
  • 构造函数和实例对象和原型之间的关系

看下面的代码

<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__)指向的是该构造函数的原型对象。



相关教程