js 中 内置对象 Function Object 和 {} 对象之间的关系 及其 prototype constructor instanceof的使用

在 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

拓展:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lianjiuxiao/article/details/113343021
今日推荐