每个函数都有一个 prototype
属性,这个属性是一个指针,指向一个函数的原型对象,这个对象包含由特定类型的所有实例共享的属性和方法。
原型对象有一个属性 constructor
,它指向函数对象。
prototype
就是通过调用构造函数而创建的那个对象实例的原型对象。
function Person (name) {
this.name = name;
}
let person = new Person('p1');
person.constructor === Person
person.__proto__ === Person.prototype
Person.__proto__ === Function.prototype
Person.protytype.__proto__ === Object.prototype
Number.prototype.constructor === Number
Function.prototype.constructor === Function
Object.prototype.constructor === Object
当调用构造函数创建一个新实例后(对象),该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象,浏览器可以通过 __proto__
访问
Number.__proto__ === Function.prototype
Number.prototype.__proto__ === Object.prototype
Function.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.ptototype
Object.__proto__ === Function.prototype
Object.prototype.__proto__ === null
Object instanceof Object // true
Object instanceof Function // true
Function instanceof Function // true
Function instanceof Object // true
原型链
例题
function Fun () {}
Fun.prototype.n = 1;
let f1 = new Fun();
Fun.prototype = {
n: 2,
m: 3
};
let f2 = new Fun();
console.log(f1.n, f1.m, f2.n, f2.m);
// 1 undefined 2 3
let Fun = function () {}
Object.prototype.a = function () {
console.log('a()');
}
Function.prototype.b = function () {
console.log('b()');
}
let f = new Fun();
f.a(); // a()
f.b(); // not a function
Fun.a(); // a()
Fun.b(); // b()
// f.__proto__ === Fun.prototype
// Fun.prototype.__proto__ === Object.prototype
// Fun.__proto__ === Function.prototype
网友评论