蓝本
标识符实例:
// 缺省
function Foo(name, age) {
this.name = name
}
Foo.prototype.alertName = function () {
alert(this.name)
}
// 建立实例
var f = new Foo(zhangsan)
f.printName = function () {
console.log(this.name)
}
// 试验
f.printName()
f.alertName()
有那个特性,它将被删掉`__proto__`(即其缺省的prototype),因而f.alertName将找出Foo。蓝本alertName”。
如何确定该特性是否是对象本身的特性?当使用“hasOwnProperty”时,它通常用于遍历对象。
var item
for (item in f) {
// 高级浏览器已经在 for in 中屏蔽了来自蓝本的特性,但是这里建议大家还是加上那个判断,保证程序的健壮性
if (f.hasOwnProperty(item)) {
console.log(item)
}
}
蓝本链
接着上面的实例,如果执行`f.toString()`时,又发生了什么?
// 省略 N 行
// 试验
f.printName()
f.alertName()
f.toString()
因为`f`本身没有`toString()`,并且`f.__proto__`(即`Foo.prototype`)中也没有`toString`。那个问题还是得拿出刚才那句话——**当试图得到一个对象的某个特性时,如果那个对象本身没有那个特性,那么会去它的`__proto__`(即它的缺省的`prototype`)中寻找**。
如果在`f.__proto__`中没有找出`toString`,那么就继续去`f.__proto__.__proto__`中寻找,因为`f.__proto__`就是一个普通的对象而已嘛!
* `f.__proto__`即`Foo.prototype`,没有找出`toString`,继续往上找
* `f.__proto__.__proto__`即`Foo.prototype.__proto__`。`Foo.prototype`就是一个普通的对象,因而`Foo.prototype.__proto__`就是`Object.prototype`,在这里可以找出`toString`
* 因而`f.toString`最终对应到了`Object.prototype.toString`
这样一直往上找,你会发现是一个链式的结构,所以叫做“蓝本链”。如果一直找出最上层都没有找出,那么就宣告失败,返回`undefined`。最上层是什么 —— `
Object.prototype.__proto__ === null`