原型

一、类型的分类

1、判断一个“数据”的类型的方法:
1)值类型:number、string、boolean、undefined
2)引用类型:object

  • 值类型的数据:用typeof()
        <script>
            console.log(typeof ("aa"));
            console.log(typeof(10));
            console.log(typeof(null));
            console.log(typeof(undefined));
        </script>
        输出结果:string
            number
            object
            undefinednull是属于object类型的)
  • 引用类型:用instanceof ;
    instanceof的作用:instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
            function fun(){}
            console.log(fun instanceof Object);
            var array=new Array();
            console.log(array instanceof Array);
            //输出结果:true

typeof只能检测到Object那一层,而instanceof可以判断对象的具体类型。

二、原型链

这里写图片描述

每一个函数function有一个对应的原型,且它有constructor属性。每个对象都有一个隐藏的属性proto(称他为隐式原型),并且指向该对象的原型。
1、prototype原型:

  • 所有的函数都是对象
  • 含有prototype属性的称为原型对象,含有constructor属性的称为原型构造器
  • 所有的proto都指向Object的原型;注意:对于有些低版本的浏览器可能不支持这个属性,

    从上面的图我们可以知道,对象stu的proto和Student函数的prototype都指向Student的隐式原型,下面用实例来看一下:

            function Student(){
                this.name="张三",
                this.age=20             
            }
            var stu=new Student();
            console.log(Student.prototype);
            console.log(stu.__proto__);

输出结果:
这里写图片描述

当我们给Student的一个属性的prototype赋值,那么它会怎么输出呢?

            function Student(){
                this.name="张三",
                this.age=20 

            }           
            Student.prototype.school="中南大学";
            var stu1=new Student();
            var stu2=new Student();
            console.log(stu1.school);
            console.log(stu2.school)

            stu1.school="湖南大学"; 
            console.log(stu1.school);
            console.log(stu2.school);

一个对象实例取属性,先看自己绑定了没有,如果自己没有绑定,那么它就会去构造这个实例的构造器去找,如果如果构造器没有,才会从它的proto指向的对象去找。所以,前面两个都会输出“中南大学”,后面两个分别会输出“湖南大学”、“中南大学”。对于前面两个输出,stu1和stu2上都没有绑定school属性,在它的构造器上也没有这个属性,所以它们回去找它的proto指向 对象。而对于第三个输出来说,stu1绑定了school属性,所以它会找自己的,而不会再去找它的proto指向 对象。
输出结果:
这里写图片描述

如果在student函数里面绑定school属性,

            function Student(){
                this.name="张三";
                this.age=20;
                this.school="华中科大";
            }           
            Student.prototype.school="中南大学";
            var stu1=new Student();
            var stu2=new Student();
            console.log(stu1.school);
            console.log(stu2.school)

            stu1.school="湖南大学"; 
            console.log(stu1.school);
            console.log(stu2.school);

输出结果:
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值