js

一、关于var spot={} 和 var spot= function(){} 的区别

var dog={}

相当于创建一个空的Object对象:

 

var dog = new Object()

 

下面这种定义方式:

 

Js代码  
  1. var Dog= function(name){this.name = name}   

 

相当于定义一个叫做Dog的Class对象(实际在JS中没有类的概念),更贴切的说法是一个创建对象的模板,通过下面这种方式新建一个空的Dog对象可以说明这个问题:

 

 

 

Js代码  
  1. var myDog  = new Dog('wangwang');  

 

“new”运算符执行的操作很简单。首先,它创建一个新的空对象。然后执行紧随其后的函数调用,将新的空对象设置为该函数中“this”的值。

 

 

 

二、如何用JS模拟私有属性

 

正常情况下,无法从函数以外访问函数内的本地变量。函数退出之后,由于各种实际原因,该本地变量将永远消失。但是,如果该本地变量被内部函数的闭包捕获,它就会生存下来。这一事实是模拟 JavaScript 私有属性的关键。假设有一个 Person 类:

 

 

 

Js代码  
  1. function Person(name, age) {  
  2.     this.getName = function() { return name; };  
  3.     this.setName = function(newName) { name = newName; };  
  4.     this.getAge = function() { return age; };  
  5.     this.setAge = function(newAge) { age = newAge; };  
  6. }  

 

 参数 name 和 age 是构造函数 Person 的本地变量。Person 返回时,name 和 age 应当永远消失。但是,它们被作为 Person 实例的方法而分配的四个内部函数捕获,实际上这会使 name 和 age 继续存在,但只能严格地通过这四个方法访问它们。因此,您可以:

 

Js代码  
  1. var ray = new Person(“Ray”, 31);  
  2. alert(ray.getName());  
  3. alert(ray.getAge());  
  4. ray.setName(“Younger Ray”);  
  5. // Instant rejuvenation!  
  6. ray.setAge(22);  
  7. alert(ray.getName() + “ is now “ + ray.getAge() + "years old"<span style="font-size: 14px; font-weight: bold;">);</span>  

 

 三、原型

 

 首先需要理解什么是原型,什么是原型链,还有对象创建过程的步骤(下面这一段是引用):

我们已经知道,用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步:第一步是建立一个新对象;第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象;第三步就是将该对象作为this参数调用构造函数,完成成员设置等初始化工作。对象建立之后,对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,与构造函数再扯不上关系了。换句话说,构造函数只是在创建对象时起到介绍原型对象和初始化对象两个作用。

用原型有什么好处:

1、代码可以比较优雅,有逻辑性,比如下面这两段代码的作用是一样的,可以第二段显然比较易读:

 

Js代码  
  1. hello = function(){};  
  2. var person = function(){  
  3.    this.hello = hello;  
  4. }  
  5.   
  6. var a = new person();  
  7. var b = new person();  
  8. a.hello();  
  9. b.hello();  

 

Js代码  
  1. var person = function(){  
  2.     
  3. }  
  4.   
  5. person.prototype.hello=function(){}  
  6.   
  7. var a = new person();  
  8. var b = new person();  
  9. a.hello();  
  10. b.hello();  

 

 2、共享代码,如果直接在function定义块里面定义一个内部方法,则由这个function新建的对象不能共享这个内部方法,相反,会为每个对象创建新的内部方法对象:

 

 

 

Js代码  
  1. var person = function(){  
  2.    this.hello = function(){}   
  3. }  
  4.   
  5. var a = new person();  
  6. var b = new person();  
  7.   
  8. console.log(a.hello == b.hello);   //false  

 

 用原型之后:

 

Js代码  
  1. var person = function(){  
  2. }  
  3. person.prototype.hello = function(){}  
  4.   
  5. var a = new person();  
  6. var b = new person();  
  7.   
  8. console.log(a.hello == b.hello); // true  

 

 

 

 四、闭包

 

http://blog.csdn.net/hitman9099/archive/2009/01/28/3854171.aspx

 

 

 

 

 

 五、匿名函数

 

编写匿名函数的3种方式:

 

1、函数字面量:首先声明一个函数对象,然后执行它。 

 

 

 

Js代码  
  1. (function(){ alert(1); } ) ( );   

 

 2、优先表达式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。 

 

 

 

Js代码  
  1. (function(){ alert(2); } ( ) );   

 

 3、void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。 

 

 

 

Js代码  
  1. void function(){ alert(3); }()   

最主要的作用:避免全局变量的污染。

 

 

posted @ 2014-05-13 23:02  阳光小屋  阅读(164)  评论(0编辑  收藏  举报