原型对象
原型(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
原型(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