JavaScript 中所有的对象都有一个内置属性,称为它的 prototype(原型)。它本身是一个对象,故原型对象也会有它自己的原型,逐渐构成了原型链。原型链终止于拥有 null 作为其原型的对象上。
访问对象原型的标准方法是 Object.getPrototypeOf()。
一个对象的原型并不总是 Object.prototype,试试这段代码:
JSCopy to Clipboard
const myDate = new Date();
let object = myDate;
do {
object = Object.getPrototypeOf(object);
console.log(object);
} while (object);
// Date.prototype
// Object { }
// null
这段代码创建了 Date 对象,然后遍历了它的原型链,记录并输出了原型。从中我们知道 myDate 的原型是 Date.prototype 对象,它(Date.prototype)的原型是 Object.prototype。
实际上,如果调用了你所熟悉的方法(如 myDate2.getMonth()),是在 Date.prototype 上定义的方法调用的。
const personPrototype = {
greet() {
console.log(`你好,我的名字是 ${this.name}!`);
},
};
function Person(name) {
this.name = name;
}
Object.assign(Person.prototype, personPrototype);
// 或
// Person.prototype.greet = personPrototype.greet;
这里我们:
- 创建了一个
personPrototype对象,它具有greet()方法 - 创建了一个
Person()构造函数,它初始化了要创建人物对象的名字
然后我们使用 Object.assign 将 personPrototype 中定义的方法绑定到 Person 函数的 prototype 属性上。