解析this.initialize.apply(this,arguments)

作者:网络    软件教程库   2020-05-22

摘自:http://www.cnblogs.com/uedt/archive/2010/06/24/1764561.html

一、 起因
那天用到prototype.js于是打开看看,才看几行就满头雾水,原因是对js的面向对象不是很熟悉,于是百度+google了一把,最后终于算小有收获,写此纪念一下^_^。
prototype.js代码片段

代码如下:
var class = {
create: function() {
return function() {
this.initialize.apply(this , arguments);
}
}
}
// class使用方法如下
var a = class.create();
a. prototype={
initialize:function(v){
this .value=v;
}
showvalue:function(){
alert(this.value);
}
}
var a = new a(‘helloword!‘);
a. showvalue();//弹出对话框helloword!

l initialize是什么
l apply方法是干什么的?
l arguments变量呢?
l 为什么new a后就会执行initialize方法?
寻找答案:

二、 js的面向对象
initialize是什么
只不过是个变量,代表一个方法,用途是类的构造函数。
其具体功能靠js的面向对象支持,那么js的面向对象是什么样子的那?和java 的有什么相同与不同?
看代码:

代码如下:
var classname = function(v){
this.value=v;
this.getvalue=function(){
return this.value;
}
this.setvalue=function(v){
this.value=v;
}
}

那么js中的函数和类有什么不同呢?
其实是一样的,classname就是一个函数,当出现在new后面的时候就作为一个构造函数来构造对象。

代码如下:
var objectname1 = new classname(“a”);//得到一个对象

其中objectname1就是执行classname构造函数后得到的对象,而在classname函数中的this指的就是new之后构造出来的对象,所以objectname1会后一个属性和两个方法。可以通过这样来调用他们:

代码如下:
objectname1.setvalue(‘‘hello‘‘);
alert(objectname1.getvalue());//对话框hello
alert(objectname1.value) ;//对话框hello

那么

复制代码 代码如下:
var objectname2 = classname(“b”);//得到一个对象

这样objectname2得到的是什么呢?显然是方法的返回值,这里classname只作为了一个普通的函数(虽然首字母大写了)。但是在之前写的classname中并没有返回值,所以objectname2会是undifinded那么“b”赋给谁了呢?在这并没有产生一个对象,而只是单纯的执行这个方法,所以这个“b”赋值给了调用这个方法的对象window,证据如下:
var objectname2 = classname(“b”);//得到一个对象
alert(window.value);//对话框b
所以js中的所有function都是一样的,但是用途可能是不同的(用作构造对象抑或是执行一个过程)。
下面该回到主题了initialize是干什么的?

代码如下:
var class = {
create: function() {
return function() {
this.initialize.apply(this , arguments);
}
}
}
var a = class.create();

这段代码是构造个一个function复制给a,这个function是

复制代码 代码如下:
function() {
this.initialize.apply(this , arguments);
}

并且后面这个方法是用来做构造函数的。当使用这个构造函数来构造对象的时候,会让构造出来的这个对象的initialize变量执行apply()方法,apply()的用途后面在说,继续说initialize。这样在初始化对象的时候会联系到initialize(怎么联系就要看apply的了)。
那么

代码如下:
a.prototype={
initialize:function(v){
this .value=v;
}
showvalue:function(){
alert(this.value);
}
}

是什么意思呢?
prototype是“原型”的意思。a是一个function(),那么a. prototype,就是function中的一个变量,其实是个对象。这个对象拥有什么方法,那么function产生的对象就拥有什么方法,故
var a = new a(‘helloword!‘);
a. showvalue();//弹出对话框helloword!
所以a对象也会有initialize方法,不只如此,每一个有a构造出来的对象都会有一个initialize方法,而在前面说过,构造的时候会调用构造函数,构造函数里面会让initialize去调用apply方法,于是在new a(‘helloword!‘)的时候initialize回去调用apply方法。这也就是调用了一个初始化的方法。

三、 call()和apply()
下面开始研究apply(),在网上找了几个资料,并结合自己的研究,了解了call()和apply()的功能。功能基本一样,function().call(object,{},{}……)或者function().apply (object,[……])的功能就是对象object调用这里的funciton(),不同之处是call参数从第二个开始都是传递给funciton的,可以依次罗列用“,”隔开。而apply只有两个参数,第二个是一个数组,其中存储了所有传递给function的参数。
this.initialize.apply(this , arguments);
是什么意思?
这里的第一个this,是指用new调用构造函数之后生成的对象,也就是前面的a,那么第二个this也当然应该是指同一个对象。那这句话就是this(也就是a)调用initialize方法,参数是arguments对象(参数的数组对象),所以在构造函数执行的时候,对象a就会去执行initialize方法来初始化,这样就和单词“initialize”的意思对上了。
那么执行initialize方法的参数怎么传递进去的呢?

四、 arguments对象
这段代码能说明一切了:

代码如下:
function test(){
alert(typeof arguments);
for(var i=0; iarguments.length; i++){
alert(arguments[i]);
}
}
test("1","2","3");
test("a","b");

执行后alert(typeof arguments);会显示object,说明arguments是对象。然后会依次打出1、2、3。说明arguments就是调用函数的实参数组。

代码如下:
var class = {
create: function() {
return function() {
this.initialize.apply(this , arguments);
}
}
}

arguments 就是create返回的构造函数的实参数组,那么在
var a = new a(‘helloword!‘);
的时候‘helloword!‘就是实参数组(虽然只有一个字符串),传递给方法apply,然后在调用initialize 的时候作为参数传递给初始化函数initialize。

解析 this.initialize.apply(this, arguments)

原文地址:http://www.cnblogs.com/limiracle/p/4481313.html

软件教程库 该篇文章地址:https://www.itjcku.com/9999/1091575.html

阅读全部内容


Tags:解析

返回首页



推荐内容

FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法

fu-a分包方式,以及从rtp包里面得到h.264数据和aac数据的方法 rfc3984是h.264的baseline码 ...

java面试题之ssh

1、写出你熟悉的开源框架以及各自的作用(项目中为什么使用ssh) 答:框架:hibernate,spring,strut ...

JDBC连接数据库的过程

以连接mysql为例: (1)加载mysql数据库连接的驱动程序。到mysql官网下载该驱动程序jar包,然后把包复制到 ...

ORACLEno1存储过程插入更新表数据

create or replace procedure sp_cust_main_data_yx(instrdate i ...

win使用telnet到ubuntu下vim显示中文为乱码的解决方法~

1.几个路径: ubuntu: /etc/default/locale 相当于 centos:/etc/sysconfi ...

mediawiki的安装与配置

apache的配置: 1. 开启php module 查看mods-enabled/php5.load 是否存在,不存在 ...

C#随机数

c#中有个random类可以非常方便的产生一个随机数,但是在使用中你会发现这个类并不是特别好用,偶尔会一直提供同一 ...

shell-入门

dos2unix start.sh 在windows系统下编写的shell脚本 在liunx下进行一次转译,否则会爆出 ...

团队开发——软件需求分析报告(HelloWorld团队)

一.项目名称超级迷宫二.设计背景随着生活节奏加快,游戏更新速度的加快,游戏大同小异缺少新颖度,同时为了满足多游戏的结合, ...

MSSQl事务的使用

注册了博客这么久没还好好写过文章呢?昨天看了我同学的博客,写的很好,每次用到以前的知识我就会去看看她写的博客,现在 ...

NSDictionary转化为NSData

之前自己写了nsdictionary转化为nsdata的一种方法如下 nsmutabledata *data = ...

nginx关键字

反向代理: proxy_pass: 负载均衡: upstream 负载均衡,有四种方式:     a/ 轮询 ...

Java设计模式之简单工厂模式

设计模式之简单工厂举例: l简单工厂模式概述 又叫静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例 l优点 ...

解题报告之POJ3686TheWindy's

解题报告 之 poj3686 the windy‘s description the windy‘s i ...

【ThinkingInJava】18、关于java中的闭包与回调

/** * 书本:《thinking in java》 * 功能:关于java中的闭包与回调,这里回调区别于c++,c+ ...

TreasureHunting (hdu3468二分匹配+bfs最短路径)

treasure hunting time limit: 4000/2000 ms (java/others)mem ...

【ThinkingInJava】19、控制框架的实现

/** * 书本:《thinking in java》 * 功能:控制框架的实现 * 文件:event.java * 时 ...

【ThinkingInJava】20、控制框架的使用(初始化系统使用)

/** * 书本:《thinking in java》 * 功能:控制框架的实现,1、控制框架的完整实现是由单个的类创建 ...

最小汉密尔顿回路问题状态压缩dp

给定n个顶点做成的图,要求从顶点0出发经过所有点一次然后回到0点的一条权#20540;之和最小的一条路的权#20540; ...

POJ1966.CableTVNetwork——无向图的点连通度

http://poj.org/problemid=1966 题目描述: 有线电视网络中,中继器的连接是双向的。如果网 ...

Oracle备忘录1

数据库管理员:安装升级oracle数据库建库,表空间,表,视图,索引。。。制定并实施备份和修复计划数据库权限管理,调优, ...

FileStream文件流

使用文件流拷贝一个较大的多媒体文件: public static void copyfile(string soucr ...

C语言BFS(5)___TT与魔法师(swustoj2464)

description tt生活在一个充满魔法的国度,为了便于管理,国王请魔法师在一些重要的城市之间造出 ...

进程类Process与多线程Thread

进程类(process)的基本操作: //通过进程类查询系统所有进程 process[] pr ...

Xml解析方式之Pull解析器的使用

xml有多种解析的方式,这篇文章只介绍用pull解析器来解析xml文件,接下来我会说明使用pull解析器来读取xml文件 ...

enum,EnumMap,EnumSet

enum基本使用 : package com.enumtest; enum shrubbery { gr ...

Hibernate乱码问题解决

乱码问题其实归根接地就是两端的字符集不统一。 解决思路也有两种: 1. 修改两端字符集统一。 2. 通过代码进行转 ...

eclipse集成struts2.3.20

需要强调的是,这里介绍的是在eclipse工具下集成struts2.3.20而不是myeclipse添加对struts2 ...

ubi文件系统制作,还是"-c"选项的问题

以下是分析记录: --------------------------------------------------- ...

如何把事情做到最好读书笔记1

开篇语: 每个人生来都具备足够的潜力,每个人都能做到别人#30524;中难以企及的事情。请永远保持初学之心,勇敢面对 ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com