在 JavaScript 中,每一个函数都有原型,函数被实例化以后,实例对象通过 prototype 属性可以访问原型,实现继承机制。
定义原型
当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null
。根据定义,null
没有原型,并作为这个原型链中的最后一个环节。
原型实际上就是一个普通对象,继承于 Object 类,由 JavaScript 自动创建并依附于每个函数身上,原型在 JavaScript 对象系统中的位置和关系如图所示
Object 和 Function 是两个不同类型的构造函数,利用运算符 new 可以创建不同类型的实例对象。实例对象、类、Object 和 Function 之间的关系如图所示。
内置对象 Object 构造函数创建一个对象包装器。
new Object() // {}
内置对象 Function 构造函数创建一个新的 Function 对象。
new Function()
//ƒ anonymous() {}
Function // ƒ Function() { [native code] }
Function.prototype // ƒ () { [native code] }
Function.constructor // ƒ Function() { [native code] }
Function.__proto__ // ƒ () { [native code] }
Object // ƒ Object() { [native code] }
Object.prototype // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ,
// hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
Object.constructor // ƒ Function() { [native code] }
Object.__proto__ // ƒ () { [native code] }
({}).constructor // ƒ Object() { [native code] }
({}).prototype // undefined
({}).__proto__ // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ,
// hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
可以得出以下结论:
1: Object 的构造器 指向 Function
Object.constructor === Function
2: {} 的构造器 指向 Object
({}).constructor === Object
3: Function Object 的原型对象的构造器 指向他自身 {}无原型对象
Function.prototype.constructor === Function
Object.prototype.constructor === Object
4:
Function.prototype === Object.__proto__ // true
Function.prototype === Object.constructor.prototype //true
Function.prototype.__proto__ === Object.prototype //true
Function.prototype.constructor.prototype === Object.prototype //false
// instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
// prototype 每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类的成员的集合。Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
// constructor 属性返回对象的构造函数。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
// 输出如下
auto // Car {make: "Honda", model: "Accord", year: 1998}
auto.constructor === Car // true
auto instanceof Car // true ;
auto instanceof Object // true;
auto instanceof Function // false;
另见文章:构造函数 实例化对象 原型对象 原型链 继承 https://blog.csdn.net/lianjiuxiao/article/details/109806396
拓展: