资讯专栏INFORMATION COLUMN

Javascript中的原型继承的一些看法与见解

princekin / 1598人阅读

摘要:按照标准,是不对外公开的,也就是说是个私有属性,但是的引擎将他暴露了出来成为了一个共有的属性,我们可以对外访问和设置。这条链就形成了原型链,继承也就通过原型链得以实现。

**js中的继承,是面向对象的知识,因为js没有类的概念,所以继承是通过对象实现的,谈到继承,就必须说到prototype,就不得不先说下new的过程。
一个小小的列子:**

我们来看看这个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的引擎将他暴露了出来成为了一个共有的属性,我们可以对外访问和设置。

这段代码很简单,相信每个人都这样写过,那就让我们看下为什么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()也都是同样的道理。这条链就形成了原型链,继承也就通过原型链得以实现。

以上代码图示:

原型和原型链就是这样,跟作用域和作用域链类似,需要慢慢品味其中的精华。

掌握了在来实际用一下把,企鹅的一道继承面试题,大概意思是一只狗刚开始会呜呜的叫,然后发生某种变异,叫声变为变异。要求用原型继承实现上述过程

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处于原型链的倒数第二层,上面的方法都会继承它的属性,但是这样有一定的问题,所有的狗都具有这个原型链中的方法了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85892.html

相关文章

  • JS程序

    摘要:设计模式是以面向对象编程为基础的,的面向对象编程和传统的的面向对象编程有些差别,这让我一开始接触的时候感到十分痛苦,但是这只能靠自己慢慢积累慢慢思考。想继续了解设计模式必须要先搞懂面向对象编程,否则只会让你自己更痛苦。 JavaScript 中的构造函数 学习总结。知识只有分享才有存在的意义。 是时候替换你的 for 循环大法了~ 《小分享》JavaScript中数组的那些迭代方法~ ...

    melody_lql 评论0 收藏0
  • 7个 Javascript 面试题及回答策略

    摘要:使用异步编程,有一个事件循环。它作为面向对象编程的替代方案,其中应用状态通常与对象中的方法搭配并共享。在用面向对象编程时遇到不同的组件竞争相同的资源的时候,更是如此。 翻译:疯狂的技术宅原文:https://www.indeed.com/hire/i... 本文首发微信公众号:jingchengyideng欢迎关注,每天都给你推送新鲜的前端技术文章 不管你是面试官还是求职者,里面...

    李义 评论0 收藏0
  • js设计模式(一)-单例模式

    摘要:虽然是弱类型的语言,但是也有构造函数和实例。也就是说,我们只在第一次调用构造函数时创建新对象,之后调用返回时返回该对象即可。而我不认为这是一个单例模式的原因如下我觉得既然两次调用同一个构造函数,返回的不是同一个对象,那不就不能成为单例模式。 写在前面 (度过一阵的繁忙期,又可以愉快的开始学习新知识了,一年来技术栈切来切去,却总觉得js都还没学完-_-) 本文主要围绕js的设计模式进行展...

    AlexTuan 评论0 收藏0
  • 详解js继承(一)

    摘要:构造函数,实例构造函数,是用来创建对象的函数,本质上也是函数。这里刚好解释一下时,说到的,可以通过实例的访问构造函数,但是本质上是原型对象的属性。 前言 最近在学vue,到周末终于有空写一些东西了(想想又能骗赞,就有点小激动!)。在javascript基础中,除了闭包之外,继承也是一个难点。因为考虑到篇幅较长,所以打算分成两个部分来写。同样基于《javascript高级程序设计》,做一...

    Object 评论0 收藏0
  • 继承实现方式及原型概述 | JavaScript 随笔

    摘要:每一个对象直接量都是的子类,即构造函数中的构造函数与普通函数并没有什么两样,只不过在调用时,前面加上了关键字,就当成是构造函数了。由于没有传入变量,在调用的构造函数时,会出错这个问题可以通过一个空对象来解决改自。 showImg(https://segmentfault.com/img/bVmNZj); 对于 OO 语言,有一句话叫Everything is object,虽然 Ja...

    chenjiang3 评论0 收藏0

发表评论

0条评论

princekin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<