美文网首页
十二、prototype

十二、prototype

作者: 幸福幸福幸福 | 来源:发表于2017-02-14 22:24 被阅读3次

每个函数的prototype属性都包含一个对象。
它只有在该函数是构造器函数时才会发挥作用。
该函数创建的所有对象都会持有一个该函数的prototype属性的引用,并可以将其当作自身的属性来使用。
prototype属性的简单使用:


下面我们将解决以下问题

  • 每个函数都有一个prototype属性,该属性存储的就是原型对象
  • 为原型对象添加属性
  • 使用原型对象中的新增属性
  • 区分对象自身属性与原型属性
  • __proto__,用于保存各对象原型的神秘链接
  • 介绍原型方法,例如:isPrototypeOf()、hasOwnProperty()、propertyIsEnumerable()
  • 如何(利用原型)强化数组或字符串这样的内建对象。
  1. 原型属性
    首先我们已经知道,在JavaScript中函数本身也是一个包含了属性(length和constructor)和方法(apply()和call())的对象。接下来我们来看函数的另外一个属性:prototype。
    prototype属性在函数被创建时就和length以及constructor这些属性一起被创建了,它的初始值是一个空对象。
    下面是一个实例过程
    //Gadget是一个构造器,我们在创建它时已经添加了name、color属性和whatAreYou方法.它自身也有length、constructor、prototype属性和call()、apply()方法
    var Gadget = function(name,color){
    this.name = name;
    this.color = color;
    this.whatAreYou = function(){
    return 'I am a '+this.color+' '+this.name;
    }
    }
    //此时Gadget()函数的prototype属性是一个空对象
    console.log(Gadget.prototype); //Object {}
    //Gadget函数实质也是一个对象所以他也有constructor属性
    console.log(Gadget.constructor); //function Function() { [native code] }
    //我们也可以自己添加prototype属性
    Gadget.prototype = {}

     //利用原型链添加属性和方法,通过构造器函数的prototype属性来增加该构造器所提供的的属性和方法:
     Gadget.prototype.price = 100;
     Gadget.prototype.rating = 3;
     Gadget.prototype.getInfo = function(){
         return 'Rating: '+this.rating+',price: '+this.price;
     };
     //如果不想他们逐一添加到原型对象中,也可以另外定义一个对象,然后将其覆盖到之前的原型上
     Gadget.prototype = {
         price : 100,
         rating : 3,
         getInfo : function(){
             return "Rating: "+this.rating+',price: '+this.price;
         }
     }
     
     var newtoy = new Gadget('webcam','black');
     console.log(newtoy.name);                   //webcam
     console.log(newtoy.color);                  //black
     console.log(newtoy.whatAreYou());           //I am a black webcam
     console.log(newtoy.rating);                 //3
     console.log(newtoy.price);                  //100
     console.log(newtoy.getInfo());              //Rating: 3,price: 100
     //如果我们此时修改原型,可以看到我们依然可以通过已经创建好的newtoy中访问Gadget新添加的原型方法
     Gadget.prototype.get = function(what){return this[what];}
     
     console.log(newtoy.get('price'));
     console.log(newtoy.get('name'));
    
  • 自身属性和原型属性
    如果在一个对象自身属性中没有找到指定的属性,就回去它的原型链中继续查找这个属性。并且自身属性优先级是高于原型属性的,因此我们可以用自身属性来重写原型属性

  • 枚举属性
    可以用for-in来循环遍历对象,然而我们在使用for-in时需要注意:
    ◇ 并不是所有的属性都会在for-in中显示,例如(数组的)length属性和constructor属性就不会显示。那些已经显示的属性被称为是可枚举的,我们可以通过各个对象所提供的propertyIsEnumerable()方法来判断其中有哪些可枚举的属性
    ◇ 原型链中的各个属性也会被显示出来,当然前提是他们是可枚举的。我们可以通过对象的hasOwnProperty()方法来判断一个属性是对象自身属性还是原型属性。
    ◇ 对于所有的原型属性,propertyIsEnumerable()都会返回false,即使他是for-in中可枚举的属性
    具体使用就跳过不写了。

  • isPrototypeOf()方法
    每个对象都有一个isPrototypeOf()方法,这个方法会告诉我们当前对象是否是另一个指定对象的原型

相关文章

网友评论

      本文标题:十二、prototype

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