JavaScirpt学习(一)

[b]js在线编辑网站:[url]http://jsfiddle.net/[/url][/b]
[b]Private Members in JavaScript[/b]
[url]http://javascript.crockford.com/private.html[/url]

JavaScript每个函数都带有一个仅在这个函数范围作用的变量arguments

function sendMessage(msg,obj){
if(arguments.length==2)
{ obj.handleMsg(Msg); }
else
{alert(Msg);}
}



JavaScript对象都带有一个属性,称为构造函数(constructor)


[b]这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量[/b]
 
function f1(){
    n=999;
   }
  f1();
  alert(n); // 999


[b]链式作用域"结构(chain scope)[/b]

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。


function f1(){
    var n=999;
    function f2(){
      alert(n); // 999
    }
  }


[b]闭包的用途[/b]
闭包可以用在许多地方。它的最大用处有两个:
一个是前面提到的可以读取函数内部的变量
另一个就是让这些变量的值始终保持在内存中。



function f1(){
var n=999;
nAdd=function(){n+=1;};
function f2()
{
alert(n);
}
return f2;
};
var result=f1();
result(); // 999
nAdd();
result()//1000;

[b]result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。[/b]

[b]Closures[/b]
[url]https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Closures[/url]


This scope
function User(name){
this.name= name;
}
var me = new User("My name");
alert(me.name=="My name");
alert(me.constructor==User);
User("Test");
alert(window.name=="Test");


因为this上下文对象没有设定,所以默认为全局的window对象,也就是说windows.name等于提供的这个名字

[b]prototype属性[/b]
通过prototype对对象进行方法的添加
简单的构造方法,和简单的原型对象

function User(name,age){
this.name = name;
this.age =age;
}
User.prototype.getname = function(){return this.name;};
User.prototype.getage = function(){return this.age;};
var user = new User("Name","24");
alert(user.getname()=="Name");
alert(user.getage()=="24");


[b]
Private method and Privileged[/b]

function Container(param) {

function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}

this.member = param;
var secret = 3;
var that = this;
}


Because dec() is private method,you can not use
var container1 = new Container(3);
container1 .dec()


[b]A privileged method is able to access the private variables and methods, and is itself accessible to the public methods and the outside. It is possible to delete or replace a privileged method, but it is not possible to alter it, or to force it to give up its secrets.[/b]

Privileged methods are assigned with this within the constructor.

function Container(param) {

function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}

this.member = param;
var secret = 3;
var that = this;

this.service = function () {
if (dec()) {
return that.member;
} else {
return null;
}
};
}


[b]动态的生成方法:[/b]


function User(properties)

{
(function(which)
{
for(var i in properties){
var p =i;
which["get"+p] = function(){
return properties[p];
};

which["set"+p] = function(val){
properties[p]= val;
};
}
}
)(this);

}

var user = new User({
name :"Bob",
age:"44"
});

alert(user.name==null);

alert(user.getname()=="Bob");

user.setage(22);

alert(user.getage()=="22");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值