js中:类、原型、构造函数

时间:2023-01-05 18:50:50
// 使用inherited函数创建对象  这个对象继承原型对象中
function inherit(p) {
    if (p== null) throw TypeError();
    if (Object.create)
      return Object.create(p);
    var t = typeof p;
    if (t != "object" && t != "function") throw TypeError();
    function f() {};
    f.prototype = p;
    return new f();
};
// 这个工厂方法返回一个心得"范围对象"
function range (from, to) {
    var r = inherit(range.methods);
    // 储存心得”范围对象“ 得其实位置和结束位置
    // 这两个属性是不可继承得, 没个对象都拥有唯一得属性
    r.from = from;
    r.to = to;
    // 返回这个创建得新对象
    return r;
}
// 原型对象定义方法,这些方法为每个范围对象所继承
range.methods = {
    includes: function (x) {
        return this.from <= x && x <= this.to;
    },
    // 对于范围内得每个整数都调用一次f
    // 这个方法只可用做数字范围。
    foreach: function (f) {
        for (var x = Math.ceil(this.from); x <= this.to; x++) f(x);
    },
    toString: function () {return "(" + this.from + "..." + this.to + ")";}
}

var r = range(1, 3); //创建一个范围对象

console.log(r.includes(2));
r.foreach(console.log);
console.log(r);
// ----------使用构造函数来定义 ”范围类“------------

function Range(from, to) {
    // 储存  范围对象 得其实位置 喝结束位置
    // 这两个属性是不可继承得, 没个对象都拥有唯一得属性
    this.from = from;
     this.to = to;
};
//所有得 范围独享 都继承自这个对象
// 这个属性得名字必须是 prototype
Range.prototype = {
    // 如果下再范围内, 则返回true 否则 false
    // 这个方法可比较数字范围,也可以比较字符串和日期范围
    includes: function (x) {return this.from <= x && x <= this.to;},
    foreach: function (f) {
        for (var x = Math.ceil(this.from); x <= this.to; x++) f(x);
    },
    // 返回表示这个范围得字符串
    toString: function () {return "(" + this.from + "..." + this.to + ")";}
}