Javascript中的原型继续的一些意见与看法

**js中的继续,是面向对象的学问,因为js没有类的观点,所以继续是经由历程对象完成的,谈到继续,就必须说到prototype,就不得不先说下new的历程。
一个小小的列子:**

<script type="text/javascript">
        var Person = function () { };
        var p = new Person();
    </script>

我们来看看这个new终究做了什么?我们能够把new的历程拆分红以下三步:

  • <1> var p={}; 也就是说,初始化一个对象p。

  • <2> p.proto=Person.prototype;

  • <3> Person.call(p);也就是说组织p,也能够称之为初始化p。

关键在于第二步,我们来证实一下:

alert(p.__proto__ === Person.prototype);

这段代码会返回true。申明我们步骤2的准确。

那末proto是什么?我们在这里简朴地说下。每一个对象都邑在其内部初始化一个属性,就是proto,当我们接见一个对象的属性 时,假如这个对象内部不存在这个属性,那末他就会去proto里找这个属性,这个proto又会有本身的proto,因而就如许 一向找下去,也就是我们日常平凡所说的原型链的观点。

根据规范,proto是不对外公然的,也就是说是个私有属性,然则Firefox的引擎将他暴露了出来成为了一个共有的属性,我们能够对外接见和设置。

<script type="text/javascript"> var Person = function () { };
        Person.prototype.Say = function () {
        alert("Person say");
    }
    var p = new Person();
    p.Say();
    </script>

这段代码很简朴,置信每一个人都如许写过,那就让我们看下为何p能够接见Person的Say。

起首var p=new Person();能够得出p.proto=Person.prototype。那末当我们挪用p.Say()时,起首p中没有Say这个属性, 因而,他就须要到他的proto中去找,也就是Person.prototype,而我们在上面定义了 Person.prototype.Say=function(){}; 因而,就找到了这个要领。

下面我们再看一下有点饶人的列子。

function tiger(){
   this.bark=function(){
   alert("我会咬人");
   };
};
//这里先定义一个山君要领


function cat(){
  this.climb=function(){
   alert("我会爬树");
};
};

//定义一个猫要领


//怎样经由历程继续让山君也学会爬树?下面最先继续。

tiger.prototype=new cat();
var hnhu=new tiger();

hnhu.climb();
hnhu.valueof();

//是否是很奇异,山君也会爬树啦,嘿嘿

连系上面的观点,我剖析一下详细的继续历程,起首new一个tiger对象,有hnhu.proto=tiger.prototype,有因为tiger.prototype=new cat();
所以tiger.prototype.proto=cat.prototype。至此继续已支付水面,转化一下获得:

hnhu.proto=tiger.prototype
hnhu.proto.proto=cat.prototype

好,算清楚了以后我们来看上面的效果,hnhu.climb()。因为hnhu没有climb这个属性,因而去hnhu.proto,也就是 tiger.prototype中去找,因为tiger.prototype中也没有climb,那就去hnhu.proto.proto,也就是cat.prototype中去找,因而就找到了alert(“我会爬树”);的要领。

寻觅valueof()也都是一样的原理。这条链就形成了原型链,继续也就经由历程原型链得以完成。

以上代码图示:

《Javascript中的原型继续的一些意见与看法》

原型和原型链就是如许,跟作用域和作用域链相似,须要逐步品尝个中的英华。

控制了在来现实用一下把,企鹅的一道继续面试题,也许意义是一只狗刚最先会呜呜的叫,然后发作某种变异,啼声变成变异。请求用原型继续完成上述历程

function dog(){
    this.fark=function(){
        alert("呜呜");
    };
};

function peter(){
    this.money=function(){
        alert("我是有钱狗");
    };
};

peter.prototype=new dog();
peter.prototype.bark=function(){
    alert("变异");
};
var tz=new peter();
tz.bark();
tz.fark();

你以至能够在Object.prototype上增添一些新属性,添加上以后不论是否是变异狗都具有这项属性,因为Object处于原型链的倒数第二层,上面的要领都邑继续它的属性,然则如许有肯定的题目,一切的狗都具有这个原型链中的要领了。

    原文作者:tz
    原文地址: https://segmentfault.com/a/1190000003100452
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞