js 学习

Function.prototype.createDelegate = function(context) {
var _t = this;
return function() {
_t.apply(context, arguments);
};
};
 
 
 
把函数本身this改成形参上下文
 
 
 
 
 
String.prototype.format = function(args) {
var str = this;
if (arguments.length == 0) {
return str;
}
for (var i = 0; i < arguments.length; i++) {
var re = new RegExp('\\{' + i + '\\}', 'gm');
str = str.replace(re, arguments[i]);
}
return str;
};
 
这里是javascript中制作滚动代码的常用属性
页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth   (包括边线的宽);
网页可见区域高: document.body.offsetHeight (包括边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop; 被盖住的高度
网页被卷去的左: document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
 
this.container.scroll(function() {
                var scrollHight = _t.container[0].scrollHeight;
                var scrollTop = _t.container[0].scrollTop;
                var height = _t.container.height();//固定的高度,才能使下述等式成立,如果div不断增长没法计算,一般让div长度固定,overflow:sroll
                // 当滚动条距离底部100像素的时候加载后续数据
                if(scrollTop + height >= scrollHight - 100 && _t._hasMoreData) {
                    _t.fetchLogs();
                }
            });
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!
 
 
 
 
 
 
 
弹出层可以 先建立一个DIV,Url指向一个页面,把页面里东西
取出来放入这个DIV里,由于是动态加载,这个层关闭时要销毁
里的东西
function modifyListener(name) {
        $.ajax({
            url : '${baseUrl}/modify',
            data : {
                name : name
            },
            success : function(data) {
                mIndex = -1;
                var d = $('<div />').appendTo($(document.body));
                d.html(data).omDialog({
;
(function($) {
/**
*
* 添加字符串的format方法,用于格式化字符串。
*
* 示例:"a{0}b{0}c{1}".format('***', 123)的结果为:a***b***c123
*
*/
String.prototype.format = function(args) {
var str = this;
if (arguments.length == 0) {
return str;
}
for (var i = 0; i < arguments.length; i++) {
var re = new RegExp('\\{' + i + '\\}', 'gm');
str = str.replace(re, arguments[i]);
}
return str;
};
 
/**
*
* 添加字符串的trim方法,用于去掉字符串开头和结尾的空格。
*
* 示例:" a a bc ".trim()的结果为:a a bc
*
*/
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
};
 
Function.prototype.createDelegate = function(context) {
var _t = this;
return function() {
_t.apply(context, arguments);
};
};
 
if (!window.AASMonitor) {
window.AASMonitor = {
_id : 1,
 
id : function() {
return this._id++;
},
 
mixin : function(target, source) {
for (k in source) {
target[k] = source[k];
}
return target;
},
 
        markFldError : function(el, msg) {
this.clearFldError(el);
if (msg) {
$(el).addClass('error');
var em = $('<span class="errorMsg">{0}</span>'.format(msg));
$(el).after(em);
$(el).mouseover(function() {
em.show();
}).mouseout(function() {
em.hide();
});
}
},
 
clearFldError : function(el) {
var next = $(el).next();
while (next.hasClass('errorMsg')) {
next.remove();
next = $(el).next();
}
$(el).removeClass('error');
$(el).unbind('mouseover').unbind('mouseout');
},
 
info : function(content) {
$.omMessageTip.show({
content : content,
timeout : 2000
});
},
 
warn : function(content) {
$.omMessageTip.show({
content : content,
type : 'warn'
});
},
 
error : function(content) {
$.omMessageTip.show({
content : content,
type : 'error'
});
},
HashMap : function() {
var size = 0;
var entry = new Object();
this.put = function(key, value) {
if (!this.containsKey(key)) {
size++;
}
entry[key] = value;
};
this.get = function(key) {
if (this.containsKey(key)) {
return entry[key];
} else {
return null;
}
};
this.remove = function(key) {
if (delete entry[key]) {
size--;
}
};
this.containsKey = function(key) {
return (key in entry);
};
this.containsValue = function(value) {
for (var prop in entry) {
if (entry[prop] == value) {
return true;
}
}
return false;
};
this.values = function() {
var values = new Array(size);
for (var prop in entry) {
values.push(entry[prop]);
}
return values;
};
this.keys = function() {
var keys = new Array(size);
for (var prop in entry) {
keys.push(prop);
}
return keys;
};
this.size = function() {
return size;
};
}
 
};
}
})(jQuery);
 
http://blog.csdn.net/qwerasdf123/article/details/4189889 EL表达式 (详解)
 
 
 
 
 
 
 
 
 
 
对象原型链继承
var a = {
  x: 10,
  calculate: function (z) {
    return this.x + this.y + z
  }
};
var b = {
  y: 20,
  __proto__: a
};
var c = {
  y: 30,
  __proto__: a
};
// 调用继承过来的方法
b.calculate(30); // 60
c.calculate(40); // 80
 
 
 
ECMAScript里的for循环并不能创建一个局部的上下文
for (var k in {a: 1, b: 2}) {
  alert(k);
}
alert(k); // 尽管循环已经结束但变量k依然在当前作用域
 
 
 
 
全局上下文中的变量对象
首先,我们要给全局对象一个明确的定义:
 
全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象;
这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻。
全局对象初始创建阶段将Math、String、Date、parseInt作为自身属性,等属性初始化,同样也可以有额外创建的其它对象作为属性(其可以指向到全局对象自身)。例如,在DOM中,全局对象的window属性就可以引用全局对象自身(当然,并不是所有的具体实现都是这样):
 
global = {
  Math: <...>,
  String: <...>
  ...
  ...
  window: global //引用自身
};
当访问全局对象的属性时通常会忽略掉前缀,这是因为全局对象是不能通过名称直接访问的。不过我们依然可以通过全局上下文的this来访问全局对象,同样也可以递归引用自身。例如,DOM中的window。综上所述,代码可以简写为:
 
String(10); // 就是global.String(10);
// 带有前缀
window.a = 10; // === global.window.a = 10 === global.a = 10;
this.b = 20; // global.b = 20;
因此,回到全局上下文中的变量对象——在这里,变量对象就是全局对象自己:
 
VO(globalContext) === global;
 
 
 
根据规范函数声明是在当进入上下文时填入的; 同意周期,在进入上下文的时候还有一个变量声明“x”,那么正如我们在上一个阶段所说,变量声明在顺序上跟在函数声明和形式参数声明之后,而且在这个进入上下文阶段,变量声明不会干扰VO中已经存在的同名函数声明或形式参数声明
alert(x); // function
var x = 10;
alert(x); // 10
x = 20;
function x() {};
alert(x); // 20
 
 
 
 
任何时候,变量只能通过使用var关键字才能声明。
a = 10;
这仅仅是给全局对象创建了一个新属性(但它不是变量)。“不是变量”并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概念,所以它“不是变量”(它之所以能成为全局对象的属性,完全是因为VO(globalContext) === global)。
 
 
 
 
 
 
 
 
在标识符解析过程中,使用函数创建时定义的词法作用域--变量解析为10,而不是20。此外,这个例子也清晰的表明,一个函数(这个例子中为从函数“foo”返回的匿名函数)的[[scope]]持续存在,即使是在函数创建的作用域已经完成之后
 
var x = 10;
function foo() {
  alert(x);
}
(function () {
  var x = 20;
  foo(); // 10, but not 20
})();
 
 
代码执行时对作用域链的影响
在ECMAScript 中,在代码执行阶段有两个声明能修改作用域链。这就是with声明和catch语句。它们添加到作用域链的最前端,对象须在这些声明中出现的标识符中查找。如果发生其中的一个,作用域链简要的作如下修改:
 
Scope = withObject|catchObject + AO|VO + [[Scope]]
在这个例子中添加对象,对象是它的参数(这样,没有前缀,这个对象的属性变得可以访问)。
 
var foo = {x: 10, y: 20};
with (foo) {
  alert(x); // 10
  alert(y); // 20
}
作用域链修改成这样:
 
Scope = foo + AO|VO + [[Scope]]
我们再次看到,通过with语句,对象中标识符的解析添加到作用域链的最前端:
 
var x = 10, y = 10;
with ({x: 20}) {
  var x = 30, y = 30; //这里 x,y是全局变量
  alert(x); // 30
  alert(y); // 30
}
alert(x); // 10
alert(y); // 30
在进入上下文时发生了什么?标识符“x”和“y”已被添加到变量对象中。此外,在代码运行阶段作如下修改:
 
x = 10, y = 10;
对象{x:20}添加到作用域的前端;
在with内部,遇到了var声明,当然什么也没创建,因为在进入上下文时,所有变量已被解析添加;
在第二步中,仅修改变量“x”,实际上对象中的“x”现在被解析,并添加到作用域链的最前端,“x”为20,变为30;
同样也有变量对象“y”的修改,被解析后其值也相应的由10变为30;
此外,在with声明完成后,它的特定对象从作用域链中移除(已改变的变量“x”--30也从那个对象中移除),即作用域链的结构恢复到with得到加强以前的状态。
在最后两个alert中,当前变量对象的“x”保持同一,“y”的值现在等于30,在with声明运行中已发生改变。
同样,catch语句的异常参数变得可以访问,它创建了只有一个属性的新对象--异常参数名。图示看起来像这样:
 
try {
  ...
} catch (ex) {
  alert(ex);
}
作用域链修改为:
 
var catchObject = {
  ex: <exception object>
};
Scope = catchObject + AO|VO + [[Scope]]
在catch语句完成运行之后,作用域链恢复到以前的状态。
 
 
 
 
 
function foo(x) {
  alert(x);
}(1); // 这只是一个分组操作符,不是函数调用!
 
(function foo(x) {
  alert(x);
})(1); // 函数调用!
 
 
// 函数声明
function foo(x) {
  alert(x);
}
// 一个分组操作符,包含一个表达式1
(1);
// 另外一个操作符,包含一个function表达式
(function () {});
// 这个操作符里,包含的也是一个表达式"foo"
("foo");
 
 
 
下面一个立即执行的函数,周围的括号不是必须的,因为函数已经处在表达式的位置,解析器知道它处理的是在函数执行阶段应该被创建的FE,
这样在函数创建后立即调用了函数.foo.bar是一个字符串而不是一个函数,这里的函数仅仅用来根据条件参数初始化这个属性——它创建后并立即调用。
因此,”关于圆括号”问题完整的答案如下:当函数不在表达式的位置的时候,分组操作符圆括号是必须的——也就是手工将函数转化成FE。
如果解析器知道它处理的是FE,就没必要用圆括号。
var foo = {
  bar: function (x) {
    alert(x);
    return x % 2 != 0 ? 'yes' : 'no';
  }(1)
};
alert(foo.bar); // 'yes'
 
下面的bar是foo对象一个方法而不是属性
var foo = {
  bar: function (x) {
    alert(x);
    return x % 2 != 0 ? 'yes' : 'no';
  }
};
 
除了大括号以外,如下形式也可以将函数转化为FE类型,例如下面都是可以立即执行
 
// 注意是1,后面的声明
1, function () {
  alert('anonymous function is called');
}();
// 或者这个
!function () {
  alert('ECMAScript');
}();
js中的多继承
function Class10()
{
    this.showSub = function(a,b)
    {
        alert(a-b);
    }
}
 
function Class11()
{
    this.showAdd = function(a,b)
    {
        alert(a+b);
    }
}
 
 
function Class2()
{
    Class10.call(this);
    Class11.call(this);
}
 
ECMAScript程序的数据类型,前5种是原始值类型,包括Undefined、Null、Boolean、String、Number、Object。
 
 
,ES5规范规定,静态对象不能扩展新的属性,并且它的属性页不能删除或者修改。他们是所谓的冻结对象,可以通过应用Object.freeze(o)方法得到。
 
var foo = {x: 10};
// 冻结对象
Object.freeze(foo);
console.log(Object.isFrozen(foo)); // true
// 不能修改
foo.x = 100;
// 不能扩展
foo.y = 200;
// 不能删除
delete foo.x;
console.log(foo); // {x: 10}
在ES5规范里,也使用Object.preventExtensions(o)方法防止扩展,或者使用Object.defineProperty(o)方法来定义属性:
 
var foo = {x : 10};
Object.defineProperty(foo, "y", {
  value: 20,
  writable: false, // 只读
  configurable: false // 不可配置
});
// 不能修改
foo.y = 200;
// 不能删除
delete foo.y; // false
// 防治扩展
Object.preventExtensions(foo);
console.log(Object.isExtensible(foo)); // false
// 不能添加新属性
foo.z = 30;
console.log(foo); {x: 10, y: 20}
 
 
对象属性的特性:所有的属性(property) 都可以有很多特性(attributes)。
{ReadOnly}——忽略向属性赋值的写操作尝,但只读属性可以由宿主环境行为改变——也就是说不是“恒定值” ;
{DontEnum}——属性不能被for..in循环枚举
{DontDelete}——糊了delete操作符的行为被忽略(即删不掉);
{Internal}——内部属性,没有名字(仅在实现层面使用),ECMAScript里无法访问这样的属性。
注意,在ES5里{ReadOnly},{DontEnum}和{DontDelete}被重新命名为[[Writable]],[[Enumerable]]和[[Configurable]],可以手工通过Object.defineProperty或类似的方法来管理这些属性。
 
var foo = {};
Object.defineProperty(foo, "x", {
  value: 10,
  writable: true, // 即{ReadOnly} = false
  enumerable: false, // 即{DontEnum} = true
  configurable: true // 即{DontDelete} = false
});
console.log(foo.x); // 10
// 通过descriptor获取特性集attributes
var desc = Object.getOwnPropertyDescriptor(foo, "x");
console.log(desc.enumerable); // false
console.log(desc.writable); // true
// 等等
 
 
 
 
A.prototype.x = 10;
var a = new A();
alert(a.x); // 10
alert(a instanceof A); // true
// 如果设置原型为null
A.prototype = null;
// ..."a"依然可以通过a.[[Prototype]]访问原型
alert(a.x); // 10
// 不过,instanceof操作符不能再正常使用了
// 因为它是从构造函数的prototype属性来实现的
alert(a instanceof A); // 错误,A.prototype不是对象
 
 
http://zqc-0101.iteye.com/blog/1140140
String.format("j2ee:j2eeType=%s,name=%s,*", serviceType, name);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值