JavaScript面向对象编程指南(第二版)
第三章 函数
1、16进制颜色转换函数
var a = (function getRGB(color){
var str = "rgb(",
i;
for(i=1; i<color.length-1; i+=2){
var tmp = color[i]+color[i+1];
if(i<5){
str += parseInt(tmp,16)+", ";
}else{
str += parseInt(tmp,16)+")";
}
}
return str;
})("#00FF00");
//调用a
a
//结果
"rgb(0, 255, 0)"
2、控制台输入如下内容,会出现什么结果?
parseInt(1e1)
parseInt(\'1e1\')
parseFloat(\'1e1\')
isFinite(0/10)
isFinite(20/0)
isNaN(parseInt(NaN))
结果:
10
1
10
true
false
true
3、以下代码,弹出的内容是什么?
var a = 1;
function f(){
function n(){
alert(a);
}
var a = 2;
n();
}
f();
结果:2
4、以下所有示例都会弹出"Boo!"警告框,您能分别解释其中原因吗?
4.1
var f = alert;
eval(\'f("Boo!")\');
4.2
var e;
var f = alert;
eval(\'e=f\')(\'Boo!\');
4.3
(function(){return alert;})()(\'Boo!\');
第4章 对象
1、请看下列代码:
function F(){
function C(){
this.name=\'abc\';
return this;
}
return C();
}
var o = new F();
请问上面的this值指向的是全局对象还是对象o?
//全局对象
2、下面的代码执行结果会是什么?
function C(){
this.a = 1;
return false;
}
console.log(typeof new C());
//object
3、下面这段代码的执行结果是什么?
c = [1,2,[1,2]];
(3) [1, 2, Array(2)]
c.sort();
(3) [1, Array(2), 2]
c.join(\'--\');
"1--1,2--2"
console.log(c);
(3) [1, Array(2), 2]
4、自定义String构造器函数
function Mystring(str){
this.str = str;
this.length = 0;
var i=0;
while(str[i]) {
i++;
}
this.length = i;
for(var i = 0; i < this.length; i++){
this[i] = str[i];
}
this.toString = function(){return str;};
this.valueOf = function(){return str;};
this.charAt = function(i){
var r = parseInt(i);
if(isNaN(res))
r = 0;
return str[r];
}
this.concat = function(s){return str + s;}
this.slice = function(s,e){
var r = \'\';
if(e == -1)
e = str.length - 1;
for(var i = s; i < e; i++){
r += str[i];
}
return r;
}
this.split = function(c){
var arr = [],
k = 0,
s = \'\';
for(var i=0; i<str.length; i++){
if(str[i] != c){
s += str[i];
}else{
arr[k++] = s;
s = \'\';
}
}
//循环结束时将最后的分割剩余的字符串(如果不为空串)添加到数组中
if(s != \'\')
arr[k] = s;
return arr;
}
//5、添加reverse()方法
this.reverse = function(){
var arr = [],
k = 0;
for(var i=str.length-1;i>=0; i--)
arr[k++] = str[i];
return arr.join(\'\');
}
}
6、自定义Array构造器函数
function MyArray(){
this.length = arguments.length;
for(var i = 0;i<this.length;i++){
this[i] = arguments[i];
};
this.toString = function(){
return this.join();
}
this.join = function(s){
var str = \'\';
if(s === undefined)
s = \',\';
for(var i = 0;i<this.length-1;i++){
str += this[i] + s;
}
str += this[i];
return str;
}
this.push = function(o){
this[this.length++] = o;
return this.length;
}
this.pop = function(){
var t = this[this.length-1];
delete this[this.length -1];
this.length--;
return t;
}
}
7、自定义Math对象,并添加以下方法:
function MyMath(){}
MyMath.rand = function(min,max,inclusive){
if(inclusive === undefined){
inclusive = true;
}
var rn = +(\'0.\'+(+new Date()+\'\').split(\'\').reverse().join(\'\'));
var rnn = rn * (max - min) + min;
var res = new Number(rnn);
res = res.toFixed(0); //获取闭区间内的数值
var res2 = parseInt(rnn); //获取开区间上的数值
if(res2 == min){
res2++;
}
return inclusive ? +res : res2;
}
MyMath.testrand = function(min,max,flag,testcount){
var arr = [],n=0,x=0;
for(var i = 0;i<testcount;i++){
var r = MyMath.rand(min,max,flag);
if(r == min)
arr[0] = ++n;
if(r == max)
arr[1] = ++x;
}
return arr;
}
MyMath.min = function(arr){
var min = arr[0];
for(var i = 0;i<arr.length;i++){
if(arr[i] < min)
min = arr[i];
}
return min;
}
MyMath.max = function(arr){
var max = arr[0];
for(var i = 0;i<arr.length;i++){
if(arr[i] > max)
max = arr[i];
}
return max;
}
第5章 原型
1、创建一个名为shape的对象,并为该对象设置一个type属性和一个getType()方法。
var shape = {
type : \'shape\',
getType : function(){
return this.type;
}
}
2、定义一个原型为shape的Triangle()的构造器函数,用Triangle()创建的对象应该
具有三个对象属性---a、b、c,分别用于表示三角形的三条边。
function Triangle(a,b,c){
this.type = \'triangle\';
this.a = a;
this.b= b;
this.c = c;
}
Triangle.prototype = shape;
Triangle.prototype.constructor = Triangle; //重写对象的prototype属性时,需要重置相应的constructor属性
3、在对象原型中添加一个名为getPerimeter()的新方法。
shape.getPerimeter = function(){return this.a+this.b+this.c;}
4、使用下面的代码来测试您之前的实现:
var t = new Triangle(1,2,3);
t.constructor == Triangle
true
shape.isPrototypeOf(t);
true
t.getPerimeter();
6
t.getType();
"triangle"
5、使用循环遍历t,列出所有的属性和方法(不包括原型部分的)。
for(var p in t){
if(t.hasOwnProperty(p))
console.log(p+" = "+t[p]);
}
6、实现随机打乱函数shuffle,执行效果如下:
if(typeof Array.prototype.shuffle !== \'function\'){
Array.prototype.shuffle = function(){
var arr = [],
len = this.length;
for(var i = 0; i < len; i++){
arr.push(this.splice(Math.floor(Math.random() * this.length),1)[0]);
}
return arr;
}
}
//执行结果:
[1,2,3,4,5,6,7,8,9].shuffle();
(9) [1, 3, 8, 7, 4, 5, 9, 6, 2]