关于原型和原型链,只要牢记一件事就很容易理解:
实例化对象的 __proto__
指向构造函数的 prototype
配合下面的例子和图示食用:
// 这是构造函数
function Person(nick, age) {
this.nick = nick;
this.age = age;
}
// 在构造函数的prototype上定义方法
Person.prototype.sayName = function() {
console.log(this.nick);
}
// 创建两个实例
var p1 = new Person('Byron', 20);
var p2 = new Person('Casper', 25);
// 以下方法没有在实例上声明,但仍然可以正确调用
p1.sayName(); // 'Byron'
p2.sayName(); // 'Casper'
再记住另一句话:
因为JS中一切都是对象,所以最终所有对象的源头都指向Object.prototype
这就解释了为什么很多变量都有公用的方法(如:toString()
、valueOf()
)了。