js之Function和Object的关系

3,382 阅读2分钟

1、根源

Object.prototype是一切对象的根源,根源之上再没有其他根源。

Object.getPrototypeOf(Object.prototype) //null

一切引用对象都来自这个“根源”对象。

2、二者的联系

Object.getPrototypeOf(Function) === Function.prototype //true

这是Function特有的,实际上Functionprototype是一个内置函数,一切函数都派生自这个内置函数,这个内置函数是一个函数工厂。这个内置函数对象的prototype指向“根源”对象。

Object.getPrototypeOf(Function.prototype) === Object.prototype//true

//等价于
Function.prototype.__proto__ === Object.prototype

所有函数的默认原型都是Object的实例,说明了ObjectFunction二者之间的联系,是通过“根源”对象联系起来的。

3、二者的关系

Function和Object,既是函数,又是对象。因为都可以Function()或者Object()这样的方式执行,又可以Function.a = 'a',Object.a = 'a'这样赋值。

说它们是函数,是因为他们都是通过“内置函数工厂”派生出来的,因而具备函数的特性。

说他们是对象。是因为他们都是通过”根源“对象派生出来,因此具备对象的特征。

Function.prototype指向“内置函数”。而Object.prototype指向“根源对象”。

因而new Function会产生一个匿名函数,而new Object产生一个plain object。

4、图形描述关系

他们之间的关系简单描述就像下面这样

详细关系,使用如下例子进行介绍

function Person(name, age){
    this.age = age;
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log(this.name);
}
var person1 = new Person('zhangsan', 25);

(1)针对每一个对象,都有一个指针[[prototype]](内部属性),指向构造函数的原型对象

(2)针对每一个函数,都有prototype属性,这个属性值是一个对象,默认情况下会有constructor属性和一些添加的属性和方法。prototype.contructor属性是一个指向prototype所在函数的指针。

Person既是函数,又是对象,有[[prototype]]属性和prototype属性。原生构造函数Object和Function也一样有这两个属性。

根据(1),Person、Object、Function作为对象,[[prototype]]属性都指向Function.prototype,如图绿色的线。person1对象的[[prototype]]属性指向它的构造函数的原型Person.prototype

Person.__proto__ === Fucntion.prototype
Object.__proto__ === Fucntion.prototype
Fucntion.__proto__ === Fucntion.prototype
person1.__proto__ === Person.prototype

根据(2),Person、Object、Function作为函数,都有prototype属性,它的值是一个对象,如黑色的线和右边框,有constructor属性,有一些属性和方法。

Person.prototype作为对象,又可以按照(1),有[[prototype]]属性,指向它的构造函数的原型Oject.prototype。Oject.prototype的[[prototype]]属性指向null

person1.__proto__ === Person.prototype
Person.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null