原型

2019-09-24  本文已影响0人  RQrry

每个函数都有一个 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
上一篇下一篇

猜你喜欢

热点阅读