到底原型是个什么鬼?

先贴一篇文章

写了这么久JS,从来没有真正去思考过这个问题,在java时代我们是

class Animal{

public myFunc(){

  

}

}

class Dog extend Animal{

public sayWangwang(){

  

}

}

haqishi=new Animal();

haqishi.myFunc();

haqishi.sayWangwang();

///////////

来到了javascript的时代,我们没了class

Dog还想用Animal的方法,该怎么办

一定要建立一些关系,其中有两个问题是必须解决的

1.继承了Animal的Dog可以调用Animal上的方法,且不可轻易修改

2.Dog实例同时可以拥有自己的同名方法,有同名方法时就先用自己的

javascript是过程性语言

我们需要用一种简单的方法:建立一个审查链条,这个链条上是实例对象,他们有自己的方法,

在这条链上寻找方法,找到了就可以返回调用。同时this指针要保证他的正确性

来路演一下:

var Animal=new function (name){

  this.name=‘animal‘||name;

}

//此时

一个名叫Animal函数实例被创建了,我们不去思考它之前的东西,假设它有一个属性是对象,姑且叫做Animal.Dad,我们在Animal.Dad上挂一个函数

Animal.Dad.breath=function(){console.log(this.name+‘xixi huhu‘)}

//接下来我们来创建一个animal

var animal=new Animal(‘dog‘);

//这时有一些奇妙的事情发生了,我们将它分成三步

1.建立空对象2.建立和Animal的联系3.调用Animal的构造函数

var animal  = {};//建立一个对象,这一步没有疑问

animal._dad_=Animal.Dad;//我们创建一个叫做_dad_的属性将他指向Animal.Dad;

Animal.call(animal,‘dog‘);//这时animal拥有了Animal函数上的所有方法属性

当我们调用animal.breath()时这个方法本身是不存在的,去内部属性_dad_上找,发现有

这时实际的过程则是:Animal.Dad.breath.call(animal);

到这里我们实际上已经解决了对象继承的初步,

那么在JAVASCRIPT里,Animal函数的Dad的真名叫做prototype,而animal实例的内部属性_dad_在标准浏览器里名字则是__proto__;

//再接下来我们试试创造一个叫做Dog的方法

var Dog=new Function(){

  

}

Dog.prototype.wangwang=function(){

console.log(‘wangwang‘)

}

这时我们的Dog拥有了自己的Dad对象上有一个方法叫做wangwang

那么我们现在想让这个Dog对象拥有Animal对象的方法breath

Dog.prototype.breath=Animal.prototype.breath;

这是一种解决方案,

如果有很多方法都想继承过来

我们可以循环遍历,这是一种办法

还有没有其他方法呢

Dog.prototype=Animal.prototype;

Dog.prototype.wangwang=function(){

console.log(‘wangwang‘)

}

似乎可以,但是很快发现这不是继承,这是修改

如何让Dog.prototype指向一个有Animal方法的对象,同时却不会破坏Animal.prototype呢

方法是有的,我们需要在Dog.prototype和Animal.prototype之间创建一个关联对象,我们叫他海龟HG

var HG=function(){

}

HG.prototype=Animal.prototype;//让HG拥有Animal上的所有原型方法

var hg=new HG();//创建一个HG对象,它拥有了Animal的原型方法

Dog.prototype=hg;//将Dog函数的原型指向实例,hg

//接下来我们调用

var xiaohuier=new Dog(‘xiaohuier‘);

xiaohuier.breath();//此时就像上面讲的创建对象时的第三步,追溯到了HG(也是Animal)原型方法

//修改时

Dog.prototype.eatBone=funciton(){

}//等价于hg.eatBone,这时Animal的原型已经被HG成功了分开了。

//最后我们把这个继承封装成一个函数

function extend(child,parent){

var F=function(){

}

F.prototype=parent.prototype;

child.prototype=new F();

}

 

时间: 2024-11-06 13:24:07

到底原型是个什么鬼?的相关文章

Python大佬分析了15万歌词,告诉你民谣歌手们到底在唱什么

前几天小编写了两篇利用Python采集网易云歌词和采集网易云音乐歌曲文章,相信小伙伴们经过实践之后都能够顺利的采集到自己想要听的歌曲.下面的歌词是小编去年11月份采集的民谣歌词,经过统计,歌词量达到将近15万. 用Python采集的民谣歌词 心血来潮,想利用Python来分析一下民谣歌手们到底在唱些什么鬼~~ 首先运用jieba库进行分词和词频统计分析,得到歌词中的词频统计,部分主要代码如下图所示: 运用jieba库进行分词和词频统计分析 得到的词频后将其导入到Excel表格中,详情如下图: 民

线程基础

线程比较重要,最近面试的话几乎都会问到, 日常中也会用到(不知不觉),到底线程是个什么鬼?结合最近看的几本书,这里做一个记录 1.什么是进程?线程?多线程?优点?缺点? 对于计算机而言,每双击一个应用程序,系统都会对此程序分配一个或者多个进程,这一点打开工作管理员界面(注销)即可明白.如此,进程则可以理解为线程的容器,由系统创建,又在具体执行过程中创建了线程.而线程是进程中的独立执行单元,对于系统而言,是通过调度线程来是应用程序工作.多线程可狭义的理解程序中包含有多个单线程的执行流. 优点: 由

android 画板之橡皮擦功能开发

记录一下橡皮擦功能开发. 讲一下原理: 橡皮擦功能要用到Paint类的一个属性: paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 这句代码的意思是: 只在源图像和目标图像相交的地方绘制目标图像 不懂没关系,首先用一个paint来绘制线条,然后用另一个paint作为橡皮擦并设置上句代码的属性,然后就变成了橡皮擦. 哎哟妈呀,我到底在说些什么鬼.... 还是看代码吧. 看代码就秒懂的...... package c

图片文字水平居中

上次想照着moe.hao123.com自己写一个看看,折腾了一下午这个问题,结果刚写到logo就放弃了,原因就是这个,这次又画一下午去弄清楚这个.大多数网站的Logo,图标和名称是在一起的. menu{ display: block; border-bottom: 1px solid rgba(0,0,0,.1); height: 4rem; padding: 0; margin: 0; } .warp{ max-width: 100%; height: 4rem; } .warp a{ col

浅话javascript的继承

javascript的继承和java或C#的继承是不一样的,后者是基于类的继承,而javascript是通过原型来继承的.所以,先得理一理原型是个什么鬼. 当一个函数对象被创建时,Function构造器产生的函数对象会运行类似这样一些代码:this.prototype={constructor:this},新对象被赋予prototype这样一个属性,它的值是一个包含constructor属性的对象.可以看出,这个constructor指向新对象本身.prototype属性指向的对象自然不会只有c

Scala在挖财的应用实践--转载

原文地址:http://www.infoq.com/cn/articles/scala-architecture-wacai 编者按:本文是根据ArchSummit大会上挖财资深架构师王宏江的演讲<Scala在挖财的应用实践>整理而成. 这次分享有三个方面,1是介绍一下挖财当前的开发情况和后端的架构, 2是挖财选择Scala的原因,3是挖财使用Scala相关的技术时碰到的问题以及经验. 第一部分是团队的情况和后端技术的架构.近一年我们的开发团队从50人增长到了现在两百人,公司总人数扩张到600

[转]VS2015编译的程序在其他机器上缺少msvcp120.dll

http://www.lai18.com/content/1159618.html 1. 今天分享一个自己在开发过程中遇到的困难. 用VS2015开发了一个windows客户端(win32项目),在自己的机器上运行很流畅.当你得意的把releas版本进行打包,并进行发布后,问题来了?很多人反馈运行时缺少msvcp140.dll,甚至有人在XP系统上完全不能用. 那么首先看看是如何解决的: 在工程上打开属性,选择C/C++,选择代码生成,把运行库改为"多线程(/MT)".重新编译即可.

python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)

一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况.但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用. 今天晚上正好好好研究了一番解答了自己心中的困惑. Q:python2.7.x里面的中文表示到底是什么鬼? A:直接来看看 In [23]: x = '好不好喝都要喝' In [24]: x Out[24]: '\xe5\xa5\xbd\xe4\xb8\x8d\xe5\xa5\xbd\xe5\x96\x9d\xe9\x83\xbd\xe8\xa6\x81\

算法面试课程笔记001 算法面试到底是什么鬼

算法面试课程笔记001算法面试到底是什么鬼 =============================================================================== 本文地址 : =============================================================================== 算法面试是什么? 让大家在面对面试中的算法问题时,有一个合理的思考路径: ·不代表能够"正确"回答每一个算法问题