面向对象的JavaScript 二 ----- Javascript高级知识

本文主要讲解javascript的高级知识。只是指出一些可能让人产生误解的知识。
1.js内置函数
parseInt()
parseFloat()
isNaN()
isFinite()
encodeURI()
decodeURI()
encodeURIComponent()
decodeURIComponent()
eval()
以上多是js标准囊括的函数,你可能会问为什么没有alert,其实alert只是浏览器实现的,但是不属于js核心标准。

2.变量作用域
关于变量作用域的问题,大家都理解一些基础的概念,那么看看如下代码:
var a = 123;
function f() {
  alert(a);
  var a = 1;
  alert(a);
}
f();
你也许认为第一个输出是123,第二个输出是1.其实,第一个输出是undefined,第二个输出是1
因为局部定义的变量会覆盖全局的变量,即使调用这个变量在定义这个变量之前(即只要在这个作用域内,局部变量就会覆盖全局变量)。

3.functions
注意js里面functions也是变量。所以可以将变量作为参数传入,以实现回调机制。同样函数还可以自调用,如下:
(
  function(){
    alert('boo');
  }
)()

在函数内部可以定义函数,作为private函数,会有一下好处:
1.保持全局作用域的干净
2.保持私有性.

4.Object
定义object和定义functions,比如定义book对象:
var book = {
  name: 'Catch-22',
  published: 1961,
  author: {
    firstname: 'Joseph',
    lastname: 'Heller'
  }
};

然后可以通过[]或者.访问属性。object中还可以定义函数(之前已经说个函数就是变量),实例如下:
var hero = {
  breed: 'Turtle',
  occupation: 'Ninja',
  say: function() {
    return 'I am ' + hero.occupation;
  }
}

而我们一般使用的定义object的方法是使用构造函数,比如:
function Hero() {
  this.occupation = 'Ninja';
}
>>> var hero = new Hero();
注意new关键字不能省略,否则
>>> var h = Hero('Leonardo');
>>> typeof h
"undefned"
这个结果肯定不是你想要的,如果省略了new, 则h实际上是Hero函数的返回值。

比较两种构建对象的方法,构造函数更好。因为使用构造函数可以使得在初始化的时候传入参数,如果没这个需求,也就不用使用构造函数了,比如json。

5.全局对象
如果js是在浏览器中运行,那么全局对象就是window。比如,你可以通过window[a]来访问到全局变量a。

6.构造器属性
每个对象由一个constructor属性,指向构造函数
>>> var h2 = Hero('Leonardo');
>>> h2.constructor
Hero(name)

7.instanceof
一下是使用instanceof的实例以及返回值:
>>> function Hero(){}
>>> var h = new Hero();
>>> var o = {};
>>> h instanceof Hero;
      true
>>> h instanceof Object;
      false
>>> o instanceof Object;
      true
可以很容易理解instanceof的作用

8.js内置对象
内建对象可以分为三类:
1.Data wrapper object 如: object array function boolean number string
2.utility object 如: Math,Date Regexp
3.error object 如:Error
之前已经详细介绍了第一类中的部分数据类型,本次介绍其他几个对象

Object是所有其它对象的父类,创建一个空对象:
>>> var o = {};
>>> var o = new Object();
一个空对象有三个properties:
o.constructor 指向这个对象的构造函数
o.toString() 返回表述这个对象的string
o.valueOf() 返回这个对象的值

array也是内建对象,类型为object,构造函数为Array(),另外比起空的对象,多了length这个属性
array还有内建方法:pop push sort join slice splice
主要介绍一下Join。join可以带个参数,表示join时候的连接字符串:
>>> var a = [3, 5, 1, 7, 'test'];
>>> a.join(' is not ');
       "1 is not 3 is not 5 is not 7 is not test"

function
function的内建属性有:
constructuor,length(函数参数的个数)
caller
propotype(关于这个在下一篇文章中会详细介绍)

string的内建方法:
toUpperCase()
toLowerCAse()
charAt()
indexOf()
lastIndexOf()
slice()
substring()

MathDate这里就不论述了,使用的时候查一下就可以了。

RegExp
创建方法:
 var re = new RegExp("j.*t");
或者是
var re = /j.*t/;
参数作用:
"g" for global
"i" for ignoreCase
"m" for multiline
比如:
>>> var re = new RegExp('j.*t', 'gmi');
另外这几个参数是可以动态修改的.
比如:
>>> re.global = false
这里提供几个简单的调用(详细内容不论述了):
 /j.*t/.test("Javascript");
    false
>>> /j.*t/i.exec("Javascript")[0]
    "Javascript"

Error Object
主要的关键字是:try catch finally,作用和java类似,给一个实例:
try {
  iDontExist();
  throw new Error('Division by zero!');
} catch (e){
  alert(e.name + ': ' + e.message);
} finally {
  alert('Finally!');
}
内建的error有:
ReferenceError TypeError Error

throw语句有更跟好的写法:
throw {
  name: "MyError",
  message: "OMG! Something terrible has happened"
}

本文就介绍到这里,写一篇文章将介绍最重要的prototype属性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章