通过原型 继承创建一个新对象,对于这一个函数的有说不出的感觉,看看语句都很简单,深层次的东西就是不知道
function inherit(p)
{
if(p == null) throw TypeError();
if(Object.create)
return Object.create(p);
vart t=typeof p;
if(t !== "object" && t !== "function") throw TypeError();
function f(){};
f.prototype=p;
return new f();
}
6.2属性的查询和设置
用 . 和[] 来访问和设置。
6.2.1 作为关系数组的对象 我看完后总结的一句话就是这一段的讲用【】可以动态指定属性名称。
6.2.2 继承
现在假设给对象的o的属性x赋值,如果o已经有属性x(非继承),那只改变已有属性x的值。如果o不存在属性x,那么赋值操作给o添加 一个新属性x。如果
之前o继承自属性x,那么这个继承的属性就被新创建的同名属性覆盖 了。
例外:
如果o继承自属性x,而这个属性是一个具有setter方法的accessor属性(参照6.6),那么将调用setter方法而不是给o创建一个属性x.需要注意的是,
setter方法是由对象o调用的,而不是定义这一个属性的原型对象调用的。
6.2.3属性访问错误
访问不存在的属性不会报错,返回undefined. 访问不存在对象的属性,会报错。所以要用以下简练的书写方法
var len = book && book.subtitle && book.subtitle.length;
给null 和undefined设置属性也会报类型错误。
给其他值设置属性也不总是成功,有一些属性是只读的,不能重新赋值,有一些对象不允许新增属性,但让人颇感意外的是设置属性的失败操作不会报错。
尽管属性赋值成功或失败的规律看起来很简单,但要描述清楚并不容易。在这些场景下给对象o设置属性p会失败:
以下情况给对象o设置属性p会失败:
o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)。
o中的属性p 是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承。
o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性(extensible attribute)是false。如果o中不存在p,而且
没有setter方法可供调用,则p一定会添加至o中。但如果o不是可扩展的,在o中不能定义新属性。
看到这里的时候有问题要问自己就是,怎么设置一个只读属性?
什么是extensible attribute 可扩展属性。