wtsgtc

JavaScript面向对象编程指南(练习)

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]

 

分类:

技术点:

相关文章:

  • 2022-01-01
  • 2022-01-01
  • 2022-01-01
  • 2022-01-06
  • 2022-01-01
  • 2022-01-01
  • 2022-01-01
  • 2022-03-05
猜你喜欢
  • 2022-01-01
  • 2022-01-01
  • 2021-05-29
  • 2022-01-01
  • 2022-01-01
  • 2022-01-01
  • 2022-01-01
相关资源
相似解决方案