火车采集器软件交流官方论坛

 找回密码
 加入会员
搜索
火车采集器V9版免费下载火车浏览器 - 可视采集,万能群发,全自动脚本工具
123
返回列表 发新帖
楼主: faunus

ChinaStock全程解析

[复制链接]
 楼主| 发表于 2008-12-14 13:29:38 | 显示全部楼层

数组定义方式

var   myArray   =   new   Array(1,2,3,4,)   //普通方式   
  var   myArray   =   new   Array(20)   //20个元素   
  var   myArray   =   [1,2,3,4,5,6]   //数组直接量
 楼主| 发表于 2008-12-14 13:35:07 | 显示全部楼层

javascript.png

 javascript.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入会员

x
 楼主| 发表于 2008-12-14 18:51:12 | 显示全部楼层

JavaScript 1.6~1.8上的高级技巧

在jslibs的项目wiki上看到这些技巧,都是一些在mozilla spidermonkey javascript上的高级戏法。在JScript上不能用的哈~。这里转过来,很多技巧挺有趣的。
原文引用在:
http://code.google.com/p/jslibs/wiki/JavascriptTips

------------------------------------------
1.   destructuring assignments
JavaScript 1.7
var{a:x}={a:7};
Print(x);// prints: 7

2.   Generator Expressions
JavaScript 1.7
[ y for( y in[5,6,7,8,9])]// is [0,1,2,3,4]

and
[ y for each ( y in[5,6,7,8,9])]// is [5,6,7,8,9]

Because in for extracts index names, and for each extracts the values.
3.   Advanced use of iterators
JavaScript 1.8
Number.prototype.__iterator__ =function(){

 
for(&#160;let i&#160;=0;&#160;i&#160;<this;&#160;i++)
&#160;&#160;
yield&#160;i;
};
for(&#160;let i&#160;in5)
&#160;
print(i);

prints:
1
2
3
4
5

This make Number object to act as a generator.
4.&#160;&#160;&#160;Expression Closures
JavaScript 1.8
function(x)&#160;x&#160;*&#160;x;

Note that braces&#160;{...}&#160;and&#160;return&#160;are implicit
5.&#160;&#160;&#160;Basic debugging
JavaScript 1.6
LoadModule('jsstd');
functionThrowAnError(){

&#160;&#160;
(function(){&#160;

&#160; &#160;&#160;
thrownewError("Whoops!");
&#160;&#160;
})();
}
try{

&#160; &#160;&#160;
ThrowAnError()
}catch(e){

&#160; &#160;&#160;
Print(e.stack);
}

prints:
Error("Whoops!")@:0
()@test.js:7
ThrowAnError()@test.js:5
@test.js:14

6.&#160;&#160;&#160;Multiple-value returns
JavaScript 1.7
function&#160;f(){

&#160;&#160;
return[1,2];
}
var[a,&#160;b]=&#160;f();
Print(&#160;a&#160;+' '+&#160;b&#160;);// prints: 1 2

7.&#160;&#160;&#160;Operator [ ] and strings ( like charAt() )
JavaScript 1.6
var&#160;str&#160;='foobar';
Print(&#160;str[4]);

prints:
a

8.&#160;&#160;&#160;indexOf() and lastIndexOf() Works on Array
JavaScript 1.6
var&#160;obj&#160;={};
var&#160;arr&#160;=['foo',567,&#160;obj,12.34];
Print(&#160;arr.indexOf(obj));// prints: 2

9.&#160;&#160;&#160;Using Array functions on a non-Array object
JavaScript 1.7
var&#160;obj&#160;={};
Array.push(obj,'foo');
Array.push(obj,123);
Array.push(obj,5.55);
Print(&#160;obj.toSource());// prints: ({0:"foo", length:3, 1:123, 2:5.55})

10.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Simulate threads using yield operator
JavaScript 1.7
var&#160;scheduler&#160;=newfunction(){

&#160;&#160;
var&#160;_workers&#160;=[];

&#160;&#160;
this.Add=function(&#160;worker&#160;){

&#160; &#160; _workers
.push(new&#160;worker());
&#160;&#160;
}

&#160;&#160;
this.Run=function(){

&#160; &#160;&#160;
while(&#160;_workers.length&#160;)
&#160; &#160; &#160;&#160;
for&#160;each&#160;(var&#160;worker&#160;in&#160;_workers&#160;)
&#160; &#160; &#160; &#160;&#160;
try{
&#160; &#160; &#160; &#160; &#160; worker
.next();
&#160; &#160; &#160; &#160;&#160;
}catch(err&#160;if&#160;err&#160;instanceofStopIteration){
&#160; &#160; &#160; &#160; &#160; _workers
.splice(&#160;_workers.indexOf(worker),1);
&#160; &#160; &#160; &#160;&#160;
}
&#160;&#160;
}
}
function&#160;worker1(){

&#160;&#160;
for(var&#160;i&#160;=0;&#160;i&#160;<5;&#160;i++){

&#160; &#160;&#160;
Print('worker1: '+i,'\n');
&#160; &#160;&#160;
yield;
&#160;&#160;
}
}

scheduler
.Add(worker1);
function&#160;worker2(){

&#160;&#160;
for(var&#160;i&#160;=0;&#160;i&#160;<10;&#160;i++){

&#160; &#160;&#160;
Print('worker2: '+i,'\n');
&#160; &#160;&#160;
yield;
&#160;&#160;
}
}

scheduler
.Add(worker2);

scheduler
.Run();

prints:
worker1:0
worker2
:0
worker1
:1
worker2
:1
worker1
:2
worker2
:2
worker1
:3
worker2
:3
worker1
:4
worker2
:4
worker2
:5
worker2
:6
worker2
:7
worker2
:8
worker2
:9

11.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;swap two variables
JavaScript 1.7
var&#160;a&#160;=1;
var&#160;b&#160;=2;
[a,b]=[b,a];

12.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Destructuring assignment with function arguments
JavaScript 1.7
function&#160;foo([a,b]){

&#160; &#160; &#160; &#160;&#160;
Print(a);
&#160; &#160; &#160; &#160;&#160;
Print(b);
}

foo
([12,34]);

Prints:
12
34

13.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;JavaScript scope and LET instruction
JavaScript 1.7
var&#160;x&#160;=5;
var&#160;y&#160;=0;
let&#160;
(x&#160;=&#160;x+10,&#160;y&#160;=12){
&#160;&#160;
Print(x+y);
}
Print(x+y);

prints:
27
5

or,
for(&#160;let i=0;&#160;i&#160;<10;&#160;i++){
&#160;&#160;
Print(i&#160;+' ');
}
Print(i);

prints:
0123456789&#160;test.js:4:ReferenceError:&#160;i&#160;isnotdefined

14.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Iterate on values
JavaScript 1.6
for&#160;each&#160;(var&#160;i&#160;in[3,23,4])
&#160; &#160; &#160; &#160;&#160;
Print(i)

Prints:
3
23
4

 楼主| 发表于 2008-12-15 12:56:00 | 显示全部楼层

chinastock_detail_getinfo

http://hq.sinajs.cn/format=js&list=sh600036,s_sh000001,s_sz399001,s_sz399106,s_sh000300

var hq_str_sh600036="招商银行,13.45,13.16,13.16,13.47,13.12,13.15,13.16,36584713,487881240,8000,13.15,24701,13.14,23279,13.13,53300,13.12,104200,13.11,16249,13.16,9100,13.17,50600,13.18,20500,13.19,9900,13.20,2008-12-15,11:35:58";
var hq_str_s_sh000001="上证指数,1962.598,8.383,0.43,459682,3135490";
var hq_str_s_sz399001="深证成指,7101.808,9.101,0.13,3601965,376566";
var hq_str_s_sz399106="深证综指,588.127,3.386,0.58,4274294440,1486010";
var hq_str_s_sh000300="沪深300,1973.973,13.593,0.69,280981,2304260";

被调用:chinastock_detail_getshtml
setTimeout(chinastock_detail_getinfo,20);

gZealChinaStock.m_ajaxRequest.responseText.split("\n").join("").split("\r").join("").split(';');
stockpattern = new RegExp('var hq_str_'+curStock.m_sFixid+'="([^"]+)";','g');

调用:
chinastock_detail_setstockinfo
    调用:
    chinastock_detail_setbigstock
        
http://finance.sina.com.cn/realstock/company/sz399001/nc.shtml

[ 本帖最后由 faunus 于 2008-12-15 22:37 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入会员

x
 楼主| 发表于 2008-12-20 14:54:34 | 显示全部楼层
对于gZealChinaStock对像的创建方式再作一点说明

引出一种类似与面向对象的设计模式
  • Crab = function(){//类的定义形式!!

  • this.leg = 10;//成员变量!!

  • //成员变量都写在这里
  • };
  • Crab.prototype = {

  • say : function(){alert('we hava '+this.leg+' legs');}

  • //成员方法都写这里
  • };
  • var
    crabObj = new
    Crab();
  • crabObj.say();

如果你以前玩过C++,那么一定非常熟悉了。这种类的定义方式是Ext的基础所在。
var crabObj = new Crab();其实执行了2个步骤!
第一:执行this.leg = 10,其结果就是crabObj.leg = 10
第二:将Crab.prototype这个对象给了crabObj,好比crabObj.say = Crab.prototype.say;
说白了,第一步交接成员变量,第二步交接成员方法。
还有些朋友喜欢这样定义类
function Crab(){
        this.leg = 10;
}
当然也是可以的
这就是最最普通的类的定义方式了。
======================
有了上面的基础,我们这一节来模拟一个简单的继承

  • Crab = function(){

  • this.leg = 10;
  • };
  • Crab.prototype.say = function(){alert('we hava '+this.leg+' legs')};
  • GenCrab = function(){//螃蟹进化成人,变成蟹将了,只有2条腿了

  • this.leg = 2;
  • }
  • function
    extend(child,father){//定义出一个继承函数,有2个参数,子类,父类

  • child.prototype = father.prototype;
  • }
  • extend(GenCrab,Crab);//这样一来,蟹将也有say的方法了
  • gCrab = new
    GenCrab();
  • gCrab.say();//执行出来 we hava 2 legs

怎么样,蟹将已经将螃蟹的方法继承下来了吧?那如果要将父类的属性也继承下来呢?我想到2个方法:
第一、把父类的属性写入prototype中,如Crab.prototype.leg = 10
第二、GenCrab.prototype = new Crab();不知道你能不能看懂,呵呵,估计网上都没有人这样用过,但这样子写能把属性和方法全部继承,其中的奥秘,请您自己思考下
好了,我们进入主题,怎么将属性继承下来的呢?
答案是第一种方法。如果您仔细看过我写的第一篇文章,您一定会说,规范约定,只有方法才写在prototype中的呀,怎么能把属性也写入呢?岂不是把清楚的事情又弄复杂了?
聪明的Ext团队,的的确确是用第一种方法的,只是在写法上稍稍改变了下
  • function
    extend(child,father,override){//定义出一个继承函数,有2个参数,子类,父类,重载对象

  • child.prototype = father.prototype;

  • for(var
    m
    in
    override){//将重载对象里面所有的东西(这里说的东西,无非就是属性和方法)都拿出来赋给子类,作为子类的属性或者方法

  • child.prototype[m] = override[m];

  • }
  • }

这样一来,又有了新的规范了,把类的属性都往override里面写,把方法仍旧往prototype里面写,我下面举个例子
  • function
    extend(child,father,override){//定义出一个继承函数,有2个参数,子类,父类,重载对象

  • child.prototype = father.prototype;

  • for(var
    m
    in
    override){//将重载对象里面所有的东西(这里说的东西,无非就是属性和方法)都拿出来赋给子类,作为子类的属性或者方法

  • child.prototype[m] = override[m];

  • }
  • }
  • Crab = function(){

  • //这里不写属性了
  • };
  • extend(Crab,Object,{leg:10,eye:2});//让Crab继承绝对父类Object,并把属性写到这里来,因为螃蟹和蟹将都有2只眼睛,所以蟹将一会将继承这个属性
  • Crab.prototype.say = function(){alert('we hava '+this.leg+' legs, '+this.eye+' eyes')};//方法仍旧在这里定义
  • GenCrab = function(){
  • }
  • extend(GenCrab,Crab,{leg:2});//这里,眼睛和脚都从父类那里继承过来了,但蟹将只有2只脚,所以我们只需要覆盖脚这个属性就可以了
  • gCrab = new
    GenCrab();
  • gCrab.say();// we have 2 legs, 2 eyes

好了,属性和方法都已经可以继承了
========================
                源代码来分析

  • extend : function(){

  • // 内联函数,不懂?就是将这个方法编译后放入内存中

  • var
    io = function(o){

  • for(var
    m
    in
    o){

  • this[m] = o[m];

  • }

  • };

  • return
    function(sb, sp, overrides){

  • if(typeof
    sp == 'object'){//如果子类还不存在,只有父类和一些属性,那么就调用这2个参数,来构造一个子类,这里面的第三步非常神奇,很难解释的清楚,大致意思就是构造出这么匿名类,并将父类的构造方法借给它用用,嘿嘿,这么解释还不明白就留言吧

  • overrides = sp;

  • sp = sb;

  • sb = function(){sp.apply(this, arguments);};

  • }

  • var
    F = function(){}, sbp, spp = sp.prototype;//sb代表子类,sbp代表子类prototype,sp代表父类,spp代表父类prototype

  • F.prototype = spp;

  • sbp = sb.prototype = new
    F();//其实就是child.prototype = father.prototype,new F()看不懂看第二节

  • sbp.constructor=sb;//这2步一会儿细说

  • sb.superclass=spp;

  • if(spp.constructor == Object.prototype.constructor){//这个分支也不可以不管

  • spp.constructor=sp;

  • }

  • sb.override = function(o){//给子类赋予一个override方法

  • Ext.override(sb, o);

  • };

  • sbp.override = io;//给子类的对象赋予override方法

  • Ext.override(sb, overrides);//将overrides里面的东西,全部赋予子类的prototype里面,不懂看第二节

  • return
    sb;//将这个全新包装的子类返回

  • };

  • }(),

我们来详细说说 sbp.constructor=sb 这个东东,为什么要写这么一步呢?因为child.prototype =father.prototype这步执行好后,会把child的constructor给抹掉,所以要把它重新指回来,那么为什么一定要配上这个constructor呢?网上有很多解释,但大都是一抄例子了事,搞了半天还是不明白有什么用处,其实constructor只是类的一个引用,当我们把一个对象调用来调用去,我们都忘记这个对象是由谁创建的时候,它就派上用场了,obj.constructor返回的就是创建obj的那个类了,明白了吧?其次,constructor还有一个方法就是反向调用,比如这样写obj.constructor.call(this),意思是用obj去调用obj的构造方法。恩恩……非常难理解,我打算后面的章节好好介绍它的用途。
sb.superclass=spp呢?superclass又是什么?这个是Ext无中生有的一个属性而已,让子类知道它的父类是谁而已,一个标记,呵呵
综上,三部曲已经出来了吧?
第一、将属性和方法都继承下来
第二、恢复constructor,建立superclass指针
第三、将子类的属性写入到子类里
看完这3节,我想你对Ext.extend不仅有了了解,而且应该体会到Ext的编码规范,通常定义一个类,有这个三步
第一:定义Child类
Child = function(){
}
第二:Ext.extend(Child,Father,{定义Child的属性})
第三:Child.prototyp = {定义Child的方法};
或者可以只用父类和属性直接构造子类
Child = Ext.extend(Father,{});
Ext更多用这个方法,并且将方法也写入{}里面,这个方法较之上面的,多了一个神奇的第三步,见上面的代码,期间的奥秘就在于,new Child()的时候,委托谁来构造,上面是Child自己来构造,而下面这种调用方式是委托Father来构造
您照着这样的思路去看源代码定会轻松不少的:)
发表于 2016-2-9 22:35:07 | 显示全部楼层
爪,以后学习下。。
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

QQ|手机版|Archiver|火车采集器官方站 ( 皖ICP备06000549 )

GMT+8, 2025-7-4 14:46

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表