JavaScript中的原型和原型链

2023-05-28 0 912

JavaScript中的原型和原型链

蓝本

标识符实例:

// 缺省

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`

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务