用Object.create来创建对象,及其兼容性写法

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;
  },
  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);

r.includes(2);
r.foreach(console.log);
r.toString();

Object.create 函数

创建一个具有指定原型且可选择性地包含指定属性的对象。

Object.create(prototype, descriptors)

prototype

必需。 要用作原型的对象。 可以为 null。

descriptors

可选。 包含一个或多个属性描述符的 JavaScript 对象。

“数据属性”是可获取且可设置值的属性。 数据属性描述符包含 value 特性,以及 writable、enumerable 和 configurable 特性。 如果未指定最后三个特性,则它们默认为 false。 只要检索或设置该值,“访问器属性”就会调用用户提供的函数。 访问器属性描述符包含 set 特性和/或 get 特性。

在以下文档模式中受支持:Internet Explorer 9 标准模式、Internet Explorer 10 标准模式和 Internet Explorer 11 标准模式。

 

inherit方法中,如果运行环境不支持Object.create那么先创建一个空的构造方法,然后把它的原型赋值为指定对象,然后用new实例就得到了新的对象

rang是一个示例
posted @ 2014-11-07 18:00  灵瞳  阅读(1170)  评论(0编辑  收藏  举报