JavaScript极简入门教程(二):对象和函数(3)


var add = function (a, b) {
    if (typeof a !== 'number' || typeof b !== 'number') {
        // 抛出异常
        throw {
            name: 'TypeError',
            message: 'add needs numbers'
        };
    }
    return a + b;
}
 
// 捕获并处理异常
try {
    add("seven");
// e 为抛出的异常对象
} catch (e) {
    console.log(e.name + ': ' + e.message);
}

为JavaScript 类型添加属性

JavaScript 中大多数类型存在构造函数:

1.对象的构造函数为 Object
2.数组的构造函数为 Array
3.函数的构造函数为 Function
4.字符串的构造函数为 String
5.数字的构造函数为 Number
6.布尔的构造函数为 Boolean
7.正则表达式的构造函数为 RegExp

我们可以向构造函数的 prototype 添加属性(常添加方法),使得此属性对相关变量可用:

复制代码 代码如下:


Number.prototype.integer = function() {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
}
 
(1.1).integer(); // 1

作用域

JavaScript 需要通过函数来构建作用域:

复制代码 代码如下:


function() {
    // ...
}();

这里创建并执行了一个匿名函数。通过作用域能够隐藏不希望暴露的变量:

复制代码 代码如下:


var obj = function() {
    // 隐藏 value,外部无法访问
    var value = 0;
 
    return {
        // 仅此方法可以修改 value
        increment: function() {
            value += 1;
        },
        // 仅此方法可以读取 value
        getValue: function() {
            return value;
        }
    };
}();
 
obj.increment();
obj.getValue() === 1;

继承

JavaScript 实现继承的方式很多。
在创建对象时,我们可以设置对象关联的原型对象,我们这样做:

复制代码 代码如下:


// 创建一个对象 o,其原型对象为 {x:1, y:2}
var o = Object.create({x:1, y:2});

Object.create 方法被定义在 ECMAScript 5 中,如果你使用 ECMAScript 3 时可以自己实现一个 create 方法:

复制代码 代码如下:


// 如果未定义 Object.create 方法
if (typeof Object.create !== 'function') {
    // 创建 Object.create 方法
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        // 创建一个新对象,此对象的原型对象为 o
        return new F();
    };
}

通过 Object.create 方法我们进行基于原型继承:一个新对象直接继承一个旧对象的属性(相对于基于类的继承,这里无需类的存在,对象直接继承对象)。范例:

复制代码 代码如下:


var myMammal = {
    name: 'Herb the Mammal',
    get_name: function() {
        return this.name;
    },
    says: function() {
        return this.saying || '';
    }
};
 
// 继承 myMammal
var myCat = Object.create(myMammal);
myCat.name = 'Henrietta';
myCat.saying = 'meow';
myCat.purr = function(n) {
    var i, s = '';
    for (i = 0; i < n; i += 1) {
        if (s) {
            s += '-';
        }
        s += 'r';
    }
    return s;
};
myCat.get_name = function() {
    return this.says() + ' ' + this.name + ' ' + this.says();
};

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgsgfj.html