js继承相关
这几天看到一篇文章详解Javascript的继承实现,发现js还是很深奥的,比如call、apply、prototype这些,问起来我也能说的头头是道的,但是看到一些复杂的代码有的时候还是会迷糊,所以查了好多资料,希望下次我也能用在代码中,写出优秀的代码,大神,我来了,哈哈哈哈哈......
1.call apply
func.call(newObj,arg1,arg2);
func.apply(newObj,[arg1,arg2]);
ecma中为了实现继承机制中的对象冒充,加入了call()和apply()两个方法。以call为例,call方法需要传入两个参数,第一个参数是this的值,第二个参数是传递给this指代的函数的值,为了改变函数内部的this指向,将函数的上下文改变为制定的新对象newObj。
function sayColor(sPrefix,sSuffix) {
alert(sPrefix + this.color + sSuffix);
};
var obj = new Object();
obj.color = "blue";
//改变sayColor中this的指向为obj,将sayColor作为obj的一个方法。
sayColor.call(obj, "The color is ", "a very nice color indeed.");
2.this.init.apply(this, arguments)

看代码的时候,发现有这么一段代码,init是定义中构造函数原型链上的方法,这里的两个this指向构造函数实例化之后的对象,这句代码的意思是当满足条件判断的时候,实例化之后的对象就会执行init方法进行初始化,并且传入arguments参数(arguments中的参数必须与init方法中的参数相匹配)。
3.Object.prototype.hasOwnProperty()
官方解释是看某个对象是否含有指定的自身属性。所有继承了prototype属性的对象都会从原型链上继承到 hasOwnProperty 方法,该方法会忽略掉那些从原型链上继承到的属性。

copy方法遍历原型链上各个方法,赋值并返回该对象。
4.对象引用
看到这样一句话,以下为引用部分
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//用来复制父类原型,由于父类原型上约定只写实例方法,所以复制的时候不必担心引用的问题
var copy = function (source) {
var target = {};
for (var i in source) {
if (source.hasOwnProperty(i)) {
target[i] = source[i];
}
}
return target;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
不明白为什么,只复制实例方法不必担心引用的问题,查资料后发现,引用是一个非常深奥的问题。希望以后能深入了解。
5.this.base()
为了实现在每个实例方法里,都能通过this.base()调用父类原型上相应的方法,该方法实现调用了一个匿名函数中返回的函数。
this.base()这个方法是通过一个匿名函数实现的,可以看到匿名函数实现的代码可读性非常强,代码结构也是很清晰的。
以下是它的经典实例。
//不使用立即执行函数表达式,在鼠标点击事件开始前,for循环已经完成
每次点击结果都为li集合的索引最大值
var li=document.getElementsByTagName('li');
for (var i=0; i<li.length; i++) {
//将当前的i作为参数传入匿名函数,将i的值保存在内存中,
(function(i){
li[i].onclick = function () {
console.log(i);
};
})(i);
}
//或者以下写法
var li=document.getElementsByTagName('li');
for (var i=0; i<li.length; i++) {
//将当前的i作为参数传入匿名函数,将i的值保存在内存中,
li[i].onclick = function (i) {
return function(){
console.log(i);
}
}(i);
}
匿名函数又叫立即执行函数表达式(Immediately-Invoked Function Expression (IIFE)),写法如下:
//多种写法
//第一种写法外面加个括号,原因是如果代码量很大,我们需要滚动到最底部去判断i是个function还是function的返回值。
var i = (function(){//代码}())
var i = (function(){//代码})()
闭包的定义是有权访问另一个作用域中的变量的函数,匿名函数也是这样的原理,匿名函数的第二个括号里面的参数传入参数,使得函数能够引用外部函数的变量,基于这个原理,我们能保存变量的状态。想了解匿名函数执行原理以及匿名函数作用域的,可看下JS----匿名函数这篇文章,我从中学到了很多,多谢园子里的大神们!

再回到javascript的继承实现,再看这个函数就很好理解了。
子类原型链的init方法用()括起来,里面是一个匿名函数,匿名函数传入两个参数(init和func),如果实例有base属性,就把它赋值给old变量。再把实例的base属性指向父类原型的init方法,func函数内部就可以通过this.base调用父类原型的方法。
小结:
javascript是一门深奥的语言,到了某个阶段会发现懂得的东西都只是皮毛,希望通过大神的指引能很快渡过这段时间,也希望我尽快减肥成功!
参考文章
1.【优雅代码】深入浅出 妙用Javascript中apply、call、bind
2.解析 this.initialize.apply(this, arguments)
js继承相关的更多相关文章
- [技术学习]js继承
今天又看了一遍js的面向对象方面的知识,重点看了继承相关内容,已经记不得看了第几次这个内容,终于觉得自己好像懂了,特记录下来过程. js面向对象继承分为两大类,主要分为对象继承和非对象继承(拷贝继承) ...
- js继承之借用构造函数继承
我的上一篇文章介绍了,原型链继承模式.但是单纯的原型链模式并不能很好地实现继承. 一.原型链的缺点 1.1 单纯的原型链继承最大的一个缺点,来自于原型中包含引用类型的值. 本来,我们没有通过原型链实现 ...
- js继承的常用方法
写在前面的话:这篇博客不适合对面向对象一无所知的人,如果你连_proto_.prototype...都不是很了解的话,建议还是先去了解一下JavaScript面向对象的基础知识,毕竟胖子不是一口吃成的 ...
- js继承机制的实现
js继承机制的实现 1. 继承的概念 说明继承的最经典的例子:几何形状.实际上,几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形.矩形和五边形 ...
- JS继承的原理、方式和应用
概要: 一.继承的原理 二.继承的几种方式 三.继承的应用场景 什么是继承? 继承:子类可以使用父类的所有功能,并且对这些功能进行扩展.继承的过程,就是从一般到特殊的过程.要了解JS继承必须首先要了解 ...
- 一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends
说实在话,以前我只需要知道"寄生组合继承"是最好的,有个祖传代码模版用就行.最近因为一些事情,几个星期以来一直心心念念想整理出来.本文以<JavaScript高级程序设计&g ...
- 关于JS继承
关于JS继承 关于继承这个概念,是由面向对象衍生出来的.而JS身为一种基于面向对象而设计的语言,它和正统的面向对象语言又是有差别的. 面向对象语言 身为面向对象语言需要对开发者提供四种能力: ①:封装 ...
- js继承
js继承有5种实现方式: 继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function ...
- js继承之call,apply和prototype随谈
在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...
随机推荐
- SQL Server中Text和varchar(max)数据类型区别
SQL Server中Text和varchar(max)数据类型区别 以前只知道text和image是可能被SQL Server淘汰的数据类型,但具体原因不太清楚,今天读书的时候发现了text与v ...
- .Net Globalization and Localization
随着互联网的发展日益壮大和活跃,网上购物交易越来越频繁,一个网站支持多种语言在所难免,所以国际化和本地化在现在的网站中的作用越来越大,一个网站的使用量和搜索量有可能受国际化的影响一点.所以在当今做一个 ...
- 【基本技能篇】>>第3篇《暗时间_指导学习的方法论——心得》
暗时间——指导学习的方法论 ——2016年2月11日 打造自己的核心竞争力:①专业领域技能:②跨领域的技能(解决问题的能力,创新思维,判断与决策能力,表达沟通能力等等):③学习能力,持续学习和思考新知 ...
- CoreOS Linux引入了Kubernetes kubelet
CoreOS Linux引入了Kubernetes kubelet 作者:Kelsey Hightower 2015年8月14日 这周我们在 CoreOS Linux 的 alpha 开发版集成了 k ...
- EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(六)
前言 在接下来的篇幅里将对系统的模块功能进行编写.主要以代码实现为主.这一篇我们需要完成系统模块“角色管理”的相关功能.完成后可以对系统框架结构有进一步了解. Abstract层 之前说过,Abstr ...
- 基于UDP协议模拟的一个TCP协议传输系统
TCP协议以可靠性出名,这其中包括三次握手建立连接,流控制和拥塞控制等技术.详细介绍如下: 1. TCP协议将需要发送的数据分割成数据块.数据块大小是通过MSS(maximum segment siz ...
- SharePoint 2010 + 左侧导航(Left Nav Bar)二级菜单的修改
SharePoint 2010 + 修改左侧导航类似顶部导航菜单的样式 查找aspmenu的控件,ID为“V4QuickLaunchMenu”,修改分别将属性“StaticDisplayLevels” ...
- ionic开发中的各种坑
提前说明:这些坑是ionic1的. 一.关于缓存:<ion-view>中设置cache-view="false"表示禁用缓存,默认为true; 二.列表进入详情页面后返 ...
- VBA嘘嘘嘘(1)——将Excel数据填入到已存在的Word模板表格(实例应用)
傻瓜可以写出机器读懂得代码,但写出让人能读懂的代码的是优秀程序员 Sub 填充() Application.ScreenUpdating = False 'ScreenUpdating 是控制你的ex ...
- bzoj2141 树状数组套Treap树
题目大意是在能够改变两个数的位置的情况下计算逆序对数 这因为是动态记录逆序对 本来单纯逆序对只要用树状数组计算即可,但这里因为更新,所以利用TReap树的删点和增加点来进行更新 大致是把每个树状数组所 ...