- 浏览: 1010598 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (367)
- JavaScript (23)
- Java (60)
- Python (41)
- 其他 (36)
- SQL (4)
- 开发工具 (26)
- Linux (15)
- AJAX (6)
- Cache (3)
- 正则 (4)
- 架构 (9)
- 手机 (3)
- MySQL (4)
- Android (115)
- vps (1)
- 网站 (4)
- scale (3)
- 搜索引擎 (3)
- iPhone (2)
- hessian (1)
- hessdroid (1)
- 411 (1)
- jstat (1)
- gc (1)
- gallery (1)
- 惯性 (1)
- eclipse (1)
- mac wget error (1)
- miui file explorer 无用 解决办法 (1)
- vim (1)
最新评论
-
qingyezhangluo:
哎。楼主您既然是分享代码的为什么要加密的呢?而且问你密码还不回 ...
android应用换皮肤(转) -
MagicError:
kavoe 写道下载文件有密码。。。。
http抓包工具 -
knightdf:
我先试下再来
JAVA的RAS加密例子 -
kavoe:
下载文件有密码。。。。
http抓包工具 -
changanfounder:
hmc1985 写道setCallbackDuringFlin ...
android gallery滑动惯性问题
<SCRIPT LANGUAGE="JavaScript">
<!--
function Class(a){
this.a=a;
this.b=function(){
alert(this.a);
}
this.c=function(){
alert("this.c")
}
}
Class.prototype.c=function(){
alert("prototype.c");
}
function A(){
Class.call(this,"aaa");//继承实例对象
}
A.prototype=new Class("aaa");//继承原型对象
alert(A.prototype.hasOwnProperty("a"))
alert(A.hasOwnProperty("a");
var a = new A();
a.b();
a.c();
//-->
</SCRIPT>
所以两个都要用 其实直接用A.prototype=new Class("aaa");只可以实现引用类型的继承 不能实现值类型的继承 呵呵 因为是原型继承
---------------------------------------------------------------------------------------
关于对象的继承,一般的做法是用复制法: Object.extend
见protpotype.js 的实现方法:
Object.extend = function(destination, source) ...{
for (property in source) ...{
destination[property] = source[property];
}
return destination;
}
除此以外,还有一种不太常见的方法: Function.apply.
apply 方法能劫持(<<Ajax in Action>> 书中用到"劫持"一语,很生动啊)另外一个对象的方法,
继承另外一个对象的属性。
示范代码如下:
Apply示范代码
<script>
function Person(name,age)...{ //定义一个类,人类
this.name=name //名字
this.age=age //年龄
this.sayhello=function()...{alert("hello")}
}
function Print()...{ //显示类的属性
this.funcName="Print"
this.show=function()...{
var msg=[]
for(var key in this)...{
if (typeof(this[key])!="function") msg.push([key,":",this[key]].join(""))
}
alert(msg.join(" "))
}
}
function Student(name,age,grade,school)...{ //学生类
Person.apply(this,arguments)
Print.apply(this,arguments)
this.grade=grade //年级
this.school=school //学校
}
var p1=new Person("jake",10)
p1.sayhello()
var s1=new Student("tom",13,6,"清华小学")
s1.show()
s1.sayhello()
alert(s1.funcName)
</script>
学生类本来不具备任何方法,但是在 Person.apply(this,arguments) 后,他就具备了 Person类的sayhello方法和 所有属性。 在 Print.apply(this,arguments) 后就自动得到了 show() 方法。
本文,作为抛砖引玉,只对 apply 的用法(在对象继承和函数劫持方面)做个小示范,其他更深入的应用要
靠大家慢慢去领会了。
之二------利用Apply的参数数组化来提高
我们再来聊聊Function.apply() 在提升程序性能方面的技巧。
我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值。
比如
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9
但是在很多情况下,我们需要找出数组中最大的元素。
var arr=[5,7,9,1]
alert(Math.max(arr)) // 这样却是不行的。一定要这样写
function getMax(arr){
var arrLen=arr.length;
for(var i=0,ret=arr[0];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
}
return ret;
}
这样写麻烦而且低效。如果用 apply呢,看代码:
function getMax2(arr){
return Math.max.apply(null,arr)
}
两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。
看性能测试:
getMax性能测试
<script>
var myArr=new Array()
function fillRnd(arrLen){ //填入 arrLen个1-10的随机数字到数组
for(var i=0,arr=[];i<arrLen;i++){
arr[i]=Math.ceil(Math.random()*10)
}
return arr
}
function getMax(arr){
var arrLen=arr.length;
for(var i=0,ret=arr[0];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
}
return ret;
}
function getMax2(arr){
return Math.max.apply(null,arr)
}
myArr=fillRnd(20*10000) //生成20万个随机数填到数组
var t1=new Date()
var max1=getMax(myArr)
var t2=new Date()
var max2=getMax2(myArr)
var t3=new Date()
if (max1!==max2) alert("error")
alert([t3-t2,t2-t1]) //在我机器上 96,464 .不同的机器,结果可能有差异
</script>
通过20万个数据的比较, getMax2 时间为 96ms 而 getmax时间为464。 两者相差5倍
再比如数组的push方法。
var arr1=[1,3,4];
var arr2=[3,4,5];
如果我们要把 arr2展开,然后一个一个追加到 arr1中去,最后让 arr1=[1,3,4,3,4,5]
arr1.push(arr2) 显然是不行的。 因为这样做会得到 [1,3,4, [3,4,5] ]
我们只能用一个循环去一个一个的push (当然也可以用 arr1.concat(arr2) 但是concat方法并不改变 arr1本身)
var arrLen=arr2.length
for(var i=0;i<arrLen;i++){
arr1.push(arr2[i])
}
自从有了 Apply ,事情就变得如此简单
Array.prototype.push.apply(arr1,arr2)
<!--
function Class(a){
this.a=a;
this.b=function(){
alert(this.a);
}
this.c=function(){
alert("this.c")
}
}
Class.prototype.c=function(){
alert("prototype.c");
}
function A(){
Class.call(this,"aaa");//继承实例对象
}
A.prototype=new Class("aaa");//继承原型对象
alert(A.prototype.hasOwnProperty("a"))
alert(A.hasOwnProperty("a");
var a = new A();
a.b();
a.c();
//-->
</SCRIPT>
所以两个都要用 其实直接用A.prototype=new Class("aaa");只可以实现引用类型的继承 不能实现值类型的继承 呵呵 因为是原型继承
---------------------------------------------------------------------------------------
关于对象的继承,一般的做法是用复制法: Object.extend
见protpotype.js 的实现方法:
Object.extend = function(destination, source) ...{
for (property in source) ...{
destination[property] = source[property];
}
return destination;
}
除此以外,还有一种不太常见的方法: Function.apply.
apply 方法能劫持(<<Ajax in Action>> 书中用到"劫持"一语,很生动啊)另外一个对象的方法,
继承另外一个对象的属性。
示范代码如下:
Apply示范代码
<script>
function Person(name,age)...{ //定义一个类,人类
this.name=name //名字
this.age=age //年龄
this.sayhello=function()...{alert("hello")}
}
function Print()...{ //显示类的属性
this.funcName="Print"
this.show=function()...{
var msg=[]
for(var key in this)...{
if (typeof(this[key])!="function") msg.push([key,":",this[key]].join(""))
}
alert(msg.join(" "))
}
}
function Student(name,age,grade,school)...{ //学生类
Person.apply(this,arguments)
Print.apply(this,arguments)
this.grade=grade //年级
this.school=school //学校
}
var p1=new Person("jake",10)
p1.sayhello()
var s1=new Student("tom",13,6,"清华小学")
s1.show()
s1.sayhello()
alert(s1.funcName)
</script>
学生类本来不具备任何方法,但是在 Person.apply(this,arguments) 后,他就具备了 Person类的sayhello方法和 所有属性。 在 Print.apply(this,arguments) 后就自动得到了 show() 方法。
本文,作为抛砖引玉,只对 apply 的用法(在对象继承和函数劫持方面)做个小示范,其他更深入的应用要
靠大家慢慢去领会了。
之二------利用Apply的参数数组化来提高
我们再来聊聊Function.apply() 在提升程序性能方面的技巧。
我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值。
比如
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9
但是在很多情况下,我们需要找出数组中最大的元素。
var arr=[5,7,9,1]
alert(Math.max(arr)) // 这样却是不行的。一定要这样写
function getMax(arr){
var arrLen=arr.length;
for(var i=0,ret=arr[0];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
}
return ret;
}
这样写麻烦而且低效。如果用 apply呢,看代码:
function getMax2(arr){
return Math.max.apply(null,arr)
}
两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。
看性能测试:
getMax性能测试
<script>
var myArr=new Array()
function fillRnd(arrLen){ //填入 arrLen个1-10的随机数字到数组
for(var i=0,arr=[];i<arrLen;i++){
arr[i]=Math.ceil(Math.random()*10)
}
return arr
}
function getMax(arr){
var arrLen=arr.length;
for(var i=0,ret=arr[0];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
}
return ret;
}
function getMax2(arr){
return Math.max.apply(null,arr)
}
myArr=fillRnd(20*10000) //生成20万个随机数填到数组
var t1=new Date()
var max1=getMax(myArr)
var t2=new Date()
var max2=getMax2(myArr)
var t3=new Date()
if (max1!==max2) alert("error")
alert([t3-t2,t2-t1]) //在我机器上 96,464 .不同的机器,结果可能有差异
</script>
通过20万个数据的比较, getMax2 时间为 96ms 而 getmax时间为464。 两者相差5倍
再比如数组的push方法。
var arr1=[1,3,4];
var arr2=[3,4,5];
如果我们要把 arr2展开,然后一个一个追加到 arr1中去,最后让 arr1=[1,3,4,3,4,5]
arr1.push(arr2) 显然是不行的。 因为这样做会得到 [1,3,4, [3,4,5] ]
我们只能用一个循环去一个一个的push (当然也可以用 arr1.concat(arr2) 但是concat方法并不改变 arr1本身)
var arrLen=arr2.length
for(var i=0;i<arrLen;i++){
arr1.push(arr2[i])
}
自从有了 Apply ,事情就变得如此简单
Array.prototype.push.apply(arr1,arr2)
发表评论
-
网站 变灰 兼容各浏览器
2010-08-23 17:28 84<script src="gray ... -
js小技巧
2009-12-10 16:24 1069感谢:http://hi.baidu.com/lundy521 ... -
prototype 1.6
2009-07-08 18:41 864http://www.never-online.net/blo ... -
display:blocK 导致的换行
2009-04-03 19:01 5310#divHeader #divNav #divLogo{mar ... -
jQuery插件---按需加载JavaScript和CSS.
2009-04-02 18:12 4072jQuery插件---按需加载JavaScript和CSS. ... -
JavaScript中的Timer是怎么工作的
2009-03-19 14:35 1481JavaScript中的Timer是怎么 ... -
JS踢掉HTML TAG
2009-02-26 17:31 1047function delHtmlTag(str){ ... -
json 格式化工具
2009-02-20 16:31 2873http://lab.gracecode.com/format ... -
javascript+dom更改html内容总结
2009-02-19 18:01 2390利用JavaScript和dom结合来动态改变HTML内容。1 ... -
IE,firefox内存溢出原因与解决方法
2009-02-18 18:51 4090JavaScript 中的内存泄漏JavaScript 是一种 ... -
网页中嵌入Flash的几种方法(消除IE控件激活虚线)
2009-01-15 15:47 2665Flash 嵌入的问题论坛中有人问了好多次,到底应该怎么用,为 ... -
js压缩
2009-01-13 15:57 1167http://dean.edwards.name/packer ... -
json注意事项
2009-01-11 18:44 13391.JavaScript 用eval 经行转换json数据时。 ... -
Cookie的规范介绍
2009-01-05 16:20 1246Cookie的规范介绍 目前有 ... -
cookie(1)
2009-01-05 16:19 1074我们已经知道,在 document 对象中有一个 cookie ... -
js压缩
2008-12-28 19:26 1288js压缩,既可压缩,又可简单加密 先去这个网站 http:// ... -
郁闷。。。
2008-12-27 16:34 1122搞了大半天,总算弄明 ... -
用JS访问操作iframe里的dom
2008-12-25 13:41 1718很多人一直都有个想法,要是可以随心所欲的操作iframe就好了 ... -
js飞舞
2008-12-23 15:32 974javascript:R=0; x1=.1; y1=.05; ... -
javascript屏蔽F5刷新键
2008-11-25 13:21 2439<script language="Javas ...
相关推荐
### JavaScript 的继承方法小结(Prototype、Call、Apply) #### 一、JavaScript 原型继承 -- Prototype 在 JavaScript 中,“一切皆对象”。通过 `new` 关键字创建的对象是函数对象,而直接赋值的对象则是一般...
主要有两种继承方式: 1. 构造函数继承(经典继承):通过`new`关键字创建一个父类(超类)的新实例,然后将其作为子类的`prototype`。 ```javascript function Student(name, grade) { Person.call(this, name)...
### JS:Call方法详解(js的继承) #### 一、Call 方法概述 在JavaScript中,`call`方法是一种非常强大的工具,它可以用来改变函数调用时的上下文环境。具体来说,`call`方法允许我们使用指定的对象作为函数内部的`...
每种继承方式都有其适用场景,开发者应根据实际需求选择合适的方法。例如,如果需要复用方法,可能更倾向于原型链继承;如果需要初始化特定的实例属性,构造函数继承可能更合适。组合继承则在大多数情况下提供了一种...
本文主要讨论了三种常见的继承方式:`prototype`、`call` 和 `apply`。 ### 1. Prototype 原型继承 在JavaScript中,每个函数都有一个`prototype`属性,这个属性是一个对象,可以用来添加或扩展实例的方法。当访问...
以下是两种经典的JavaScript面向对象继承方法的详细解释: 1. **基于原型的继承**: 这种方法是JavaScript最基础的继承方式,通过`prototype`属性实现。在提供的代码示例中,首先定义了一个`Pet`对象,它有一个...
以上就是JavaScript中常见的几种继承方式,每种都有其优缺点。在实际开发中,可以根据项目需求和性能考虑选择合适的方法。随着语言的发展,ES6引入了类(class)的概念,虽然在语法上更像传统的面向对象语言,但其...
在JavaScript中,面向对象编程是实现复杂功能和代码复用的关键。继承是面向对象的核心特性之一,它...文章中的`inheritance.html`和`inheritance.js`文件可能包含示例代码,帮助你直观地了解每种继承方式的实现和使用。
1. **作用域**:JavaScript有两种作用域,全局作用域和局部作用域。通过在函数内部定义变量,我们可以创建局部作用域,限制变量的访问范围。 2. **闭包**:闭包允许函数访问并操作其词法作用域内的变量,即使该函数...
### JavaScript继承的三种方法实例详解 #### 一、概述 在JavaScript中,虽然原生语言层面没有提供传统意义上的“类”这一概念,但它...理解并掌握这几种继承方式对于编写高质量、可维护的JavaScript代码至关重要。
JavaScript是一种基于原型(Prototype)的面向对象编程语言,它的继承机制不同于传统的类继承,而是采用原型链(Prototype Chain)的方式实现。在这个模式下,对象可以继承其他对象的属性和方法,形成一种“类”的...
本资料集合关注的是JavaScript中的继承派生以及与之相关的`apply`和`call`方法。 **继承**是面向对象编程的关键概念,允许一个对象(子类)继承另一个对象(父类)的属性和方法。在JavaScript中,由于它没有内置的...
在给定的代码示例中,我们看到了两种不同的尝试实现JavaScript继承的方式,一种是通过`call()`方法进行对象冒充,另一种是通过修改`prototype`属性实现原型链继承。下面我们将详细探讨这两种方式以及它们在实际代码...
JavaScript是一种广泛应用于Web开发的动态编程语言,以其灵活性和强大的功能而著称。在JavaScript中,继承是实现代码复用和构建复杂对象层次结构的关键机制。本篇文章将深入探讨JavaScript继承的实例,以及如何通过...
原型链继承是通过将一个对象设置为另一个对象的原型,从而实现继承的一种方法。这种方式简单直观,但存在一些缺点,比如不能向父类传递初始化参数,且所有实例共享同一个属性。 **示例代码解析**: ```javascript ...
在JavaScript中,`call`和`apply`方法是两种非常重要的函数调用方式,它们允许我们改变函数执行时的上下文(即`this`的指向)以及传递参数。在这里,我们将详细讨论如何利用`call`实现继承,并结合提供的代码示例...
在JavaScript中,有两种类型的继承:原型链继承和构造函数继承。本文主要关注原型链继承,它是基于对象的`[[Prototype]]`属性和函数的`prototype`属性实现的。 1. **`prototype`**: - 每个函数对象都有一个`...
在JavaScript中,`call` 和 `apply` 是两种非常重要的函数调用方式,它们都用于改变函数执行时的上下文,即`this`的指向。本文将深入探讨这两种方法的用法及其在实际编程中的应用。 ### 1. `call` 的基本用法 `...
3. 组合继承:组合继承结合了原型链和借用构造函数两种方式,是JavaScript中最常用的继承方式。它使用原型链继承原型上的属性和方法,又通过借用构造函数继承实例属性,这样既保证了功能的完整,又能实现属性和方法...
`__proto__`和`Object.getPrototypeOf()`是访问对象原型的两种方式,它们可以用来查看或操作对象的原型链: ```javascript console.log(person1.__proto__ === Person.prototype); // 输出 true console.log(Object...