日期:2014-05-16  浏览次数:20416 次

js 小结
原型对象

原型(prototype),是JavaScript特有的一个概念,通过使用原型,JavaScript可以建立其传统OO语言中的继承,从而体现对象的层次关系。JavaScript本身是基于原型的,每个对象都有一个prototype的属性来,这个prototype本身也是一个对象,因此它本身也可以有自己的原型,这样就构成了一个链结构。

访问一个属性的时候,解析器需要从下向上的遍历这个链结构,直到遇到该属性,则返回属性对应的值,或者遇到原型为null的对象(JavaScript的基对象Object的prototype属性即为null),如果此对象仍没有该属性,则返回undefined.

对象的声明有三种方式:



?  通过new操作符作用域Object对象,构造一个新的对象,然后动态的添加属性,从无到有的构筑一个对象。

?  定义对象的“类”:原型,然后使用new操作符来批量的构筑新的对象。

?  使用JSON,这个在下一节来进行详细说明
函数作用域
作用域的概念在几乎所有的主流语言中都有体现,在JavaScript中,则有其特殊性:JavaScript中的变量作用域为函数体内有效,而无块作用域

call和apply

call和apply通常用来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数,只有一个参数的时候call和apply的使用方式是一样的,而多个apply的第二个参数为一个函数需要的参数组成的一个【】数组,而call则需要跟若干个参数,参数之间以逗号(,)隔开即可。我们不妨来看看2.1.3小节的例子:
<script>
//定义一个人,名字为jack
var jack = {
    name : "jack",
    age : 26
}

//定义另一个人,名字为abruzzi
var abruzzi = {
    name : "abruzzi",
    age : 26
}

//定义一个全局的函数对象
function printName(){
    return this.name;
}

//设置printName的上下文为jack, 此时的this为jackcall 方法  
//调用一个对象的一个方法,以另一个对象替换当前对象。
//call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
document.write(printName.call(jack)+"<br>");
//设置printName的上下文为abruzzi,此时的this为abruzzi
document.write(printName.call(abruzzi)+"<br>");


//定义一个"类",Address
function Address(street, xno){
    this.street = street || 'Huang Quan Road';
    this.xno = xno || 135;
    this.toString = function(){
       return "street : " + this.street + ", No : " + this.xno;  
    }
}

//定义另一个"类",Person
function Person (name, age, addr) {
  this.name = name || 'unknown';
  this.age = age;
  this.addr = addr || new Address(null, null);
  this.getName = function () {return this.name;}
  this.getAge = function(){return this.age;}
  this.getAddr = function(){return this.addr.toString();}
}

//通过new操作符来创建两个对象,注意,这两个对象是相互独立的实体
var jack = new Person('jack', 26, new Address('Qing Hai Road', 123));
var abruzzi = new Person('abruzzi', 26);

//查看结果
document.write(jack.getName()+"<br>");
document.write(jack.getAge()+"<br>");
document.write(jack.getAddr()+"<br>");

document.write(abruzzi.getName()+"<br>");
document.write(abruzzi.getAge()+"<br>");
document.write(abruzzi.getAddr()+"<br>");


var obj = {
    name : "abruzzi",
    age : 26,
    birthday : new Date(1984, 4, 5),
    addr : {
       street : "Huang Quan Road",
       xno : "135"
    }
}

document.write(obj.name+"<br>");

function p(){
    document.write("invoke p by ()");
}

p.id = "func";
p.type = "function";

document.write(p+"<br>");
document.write(p.id+":"+p.type+"<br>");
document.write(p());


var str = "global";
function scopeTest(){
    document.write(str+"<br>");
    var str = "local";
    document.write(str+"<br>");
}

scopeTest();

</script>



声明:本文内容来源于http://www.iteye.com/wiki/javascript-core/2274-JavaScript-Core