//返回了一个继承自原型对象p的属性的新对象 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(); }
属性访问错误
属性访问并不总是返回或设置一个值。查询一个不存在的属性并不会报错,如果在对象o自身的属性或继承的属性中均未找到这个属性x,属性访问表达式o.x返回undefine。回想一下我们的book对象有属性“sub-title”,而没有属性“subtitle”:
book.subtitle undefined
试图查询这个不存在的对象的属性就会报错。null和undefined值都没有属性,因为查询这些值的属性会报错,接上例:
//抛出一个类型错误异常,undefined没有length属性
var len=book.subtitle.length;
除非确定book和book.subtitle都是(或在行为上)对象。否则不能这样写表达式book。subtitle.length,因为这样会报错,下面提供了两种避免出错的方法。
var len=undefined;
if(book){
if(book.subtitle) len=book.subtitle.length;
}
var len=book&&book.subtitle&&book.subtitle.length;
//判断类型
function classof(o){ if(o===null){retuen "Null"} if(o===undefined){return "Undefined"} return Object.prototype.toString().call(o).slice(8,-1) }
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.method); r.from =from; r.to=to; return r } range.method={ include:function(x){ return this.from<=x&&this.to>=x; }, 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.include(2)); r.foreach(console.log); console.log(r); var b=range(2,4); console.log(b); console.log(r)
//上面这段代码有利于深入了解inherit这个函数,由函数生成的对象的是一个具有自己地址的对象。
function type(o){ var t,c,n; if (o==null) return "null"; if (o!==o) return "nan"; if (t = typeof o!=="object") return t; if ((c = classof(o))!=="Object") return c; if (o.constructor&&typeof o.constructor==="function"&&(n = o.constructor.getName())) return n; return "Object" };
Function.prototype.getName =function(){ if ("name" in this) return this.name; return this.name=this.toString().match(/functions*([^(]*)(/)[1] }
function classof(o){ return Object.prototype.toString.call(o).slice(8,-1); }
//赋值失败,但没报错,Object.prototype没有修改
删除属性
delete运算符,
delete book.author
delete book["main title"]
---恢复内容结束---
//返回了一个继承自原型对象p的属性的新对象 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(); }
属性访问错误
属性访问并不总是返回或设置一个值。查询一个不存在的属性并不会报错,如果在对象o自身的属性或继承的属性中均未找到这个属性x,属性访问表达式o.x返回undefine。回想一下我们的book对象有属性“sub-title”,而没有属性“subtitle”:
book.subtitle undefined
试图查询这个不存在的对象的属性就会报错。null和undefined值都没有属性,因为查询这些值的属性会报错,接上例:
//抛出一个类型错误异常,undefined没有length属性
var len=book.subtitle.length;
除非确定book和book.subtitle都是(或在行为上)对象。否则不能这样写表达式book。subtitle.length,因为这样会报错,下面提供了两种避免出错的方法。
var len=undefined;
if(book){
if(book.subtitle) len=book.subtitle.length;
}
var len=book&&book.subtitle&&book.subtitle.length;
//判断类型
function classof(o){ if(o===null){retuen "Null"} if(o===undefined){return "Undefined"} return Object.prototype.toString().call(o).slice(8,-1) }
//赋值失败,但没报错,Object.prototype没有修改
删除属性
delete运算符,
delete book.author
delete book["main title"]