美文网首页
Javascript中prototype属性详解

Javascript中prototype属性详解

作者: 敢梦敢当 | 来源:发表于2017-05-14 11:19 被阅读0次

    1 构造函数的介绍:

    所谓构造函数,就是提供一个生成对象的模板并描述对象基本结构的函数。一个构造函数,可以生成多个对象。每个对象都有相同的结构。构造函数就是对象的模板,对象就是构造函数的实例
    构造函数的特点有:

    a:构造函数的函数名首字母必须大写。

    b:内部使用this对象,来指向将要生成的对象实例。

    c:使用new操作符来调用构造函数,并返回对象实例。
    例子

    function Person(){
    2         this.name = 'keith';
    3     }
    4 
    5     var boy = new Person();
    6     console.log(boy.name);    //'keith'
    

    2 prototype属性的作用

    js中每个数据类型都是对象(除了null和undefined),而每个对象都继承自另外一个对象,后者称为“原型”(prototype)对象,只有null除外,它没有自己的原型对象。

    原型对象上的所有属性和方法,都会被对象实例所共享。

    通过构造函数生成对象实例时,会将对象实例的原型指向构造函数的prototype属性。每一个构造函数都有一个prototype属性,这个属性就是对象实例的原型对象。

    function Person(name,height){
     2         this.name=name;
     3         this.height=height;
     4     }
     5 
     6     Person.prototype.hobby=function(){
     7         return 'watching movies';
     8     }
     9 
    10     var boy=new Person('keith',180);
    11     var girl=new Person('rascal',153);
    12 
    13     console.log(boy.name);    //'keith'
    14     console.log(girl.name);    //'rascal'
    15     console.log(boy.hobby===girl.hobby);  //true
    

    对于构造函数来说,prototype是作为构造函数的属性;对于对象实例来说,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。

    原型对象的属性不是对象实例的属性。对象实例的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改原型对象上的属性和方法,变动就会立刻体现在所有对象实例上。

    Person.prototype.hobby=function(){
    2         return 'swimming';
    3     }
    4     console.log(boy.hobby===girl.hobby);  //true
    5     console.log(boy.hobby());    //'swimming'
    6     console.log(girl.hobby());    //'swimming'
    

    总结
    a:原型对象的作用,就是定义所有对象实例所共享的属性和方法。

    ** b:prototype,对于构造函数来说,它是一个属性;对于对象实例来说,它是一个原型对象。**

    3原型链

    对象的属性和方法,有可能是定义在自身,也有可能是定义在它的原型对象。由于原型对象本身对于对象实例来说也是对象,它也有自己的原型,所以形成了一条原型链(prototype chain)。比如,a对象是b对象的原型,b对象是c对象的原型,以此类推。所有一切的对象的原型顶端,都是Object.prototype,即Object构造函数的prototype属性指向的那个对象。

    当然,Object.prototype对象也有自己的原型对象,那就是没有任何属性和方法的null对象,而null对象没有自己的原型

    console.log(Object.getPrototypeOf(Object.prototype));    //null
     console.log(Person.prototype.isPrototypeOf(boy))    //true
    

    原型链(prototype chain)的特点有:

    a:读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。

    b:如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overiding)。

     c:一级级向上在原型链寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链。

    相关文章

      网友评论

          本文标题:Javascript中prototype属性详解

          本文链接:https://www.haomeiwen.com/subject/qifqxxtx.html