JavaScript 有个原型链,既然是链,那它肯定存在链的起始和链的结束。上篇文章中有这样一句话:
每个对象都有一个__proto__对象属性(除了Object);每个函数都有一个Prototype 对象属性。
一个函数本身就是一个对象,它的原型链由自身发出(链的结束),一直延伸到 Object 的 prototype(链的起始)。
当访问一个对象的属性时,先检查自身属性,如果没有,则会沿着原型链一直找下去。(上文有详细结束)
一、Object.prototype
Object.prototype 属性表示 Object 的原型。JavaScript 中几乎所有的对象都是 Object 的实例;所有的对象都继承了 Object.prototype 的属性和方法,它们可以被覆盖(除了以null 为原型的对象,如Object.create(null))。例如,新的构造函数的原型覆盖原来的构造函数的原型,提供它们自己的 toString() 方法。对象的原型的改变会传递到所有对象上,除非这些属性和方法被其他对象原型链更里层的改动所覆盖。
就以 toString() 方法为例:
1. 最根本的 toString()
默认情况下,toString() 方法被每个继承自Object的对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回“[object type]”, 其中 type 是对象类型。
例如:
被重写的对象也可以通过 call 或者 apply 函数调用最原始的toString()方法。
这个 toString() 的最佳事件,有兴趣的同志们可以查看一下 jQuery 中 type 方法的实现。
注:从JavaScript 1.8.5开始,用null 调用 toString() 方法会返回 [object Null],类似的用?developer/article/1935809/undefined 调用会返回 [object Undifined]。
2. 重写的 toString()
可以在新创建的函数的原型上自定义 一个方法来取代默认的 toString() 方法。该方法不能传入参数并且必须返回一个字符串。自定义的 toString() 方法可以是我们需要的值,但如果它附带有关对象的信息,它将变的非常有用。
在下面的代码中,定义了一个Dog对象数据类型,并且创建了该对象的一个实例:
function Dog(name,breed,color,sex) {
this.name=name;
this.breed=breed;
this.color=color;
this.sex=sex;
}
var theDog = new Dog(
"Gabby","Lab","chocolate","female");
如果当前的对象调用了 toString()
方法,它将会返回从 Object 继承下来的
toString()
方法的返回默认值:
theDog.toString(); // 返回 [object Object]
下面的代码中定义了一个叫做 dogToString()
的方法来覆盖默认的 toString()
方法。这个方法生成一个 "property = value" 形式的字符串,该字符串包含了当前对象的 name, breed,color 和 sex的值。
Dog.prototype.toString = function dogToString() {
var ret = "Dog " + this.name
+ " is a " + this.sex
+ " " + this.color
+ " " + this.breed;
return ret;
}
有了上面的这段代码之后,在上下文中任何时候使用 theDog
,JavaScript 都会自动调用 dogToString()
方法,并且返回下面的字符串内容:
Dog Gabby is a female chocolate Lab