Object 和 Function

var F = function(){};
Object.prototype.a = function(){};
Function.prototype.b = function(){};

F既能访问到a,也能访问到b(Object 和 Function也同样, 但是所有的实例只能访问到a),F是Object 和 Function两个的实例, 那么 Object 和 Function 到底是什么关系?

这是我对 Object 和 Function 的了解

F instanceof Object
true
F instanceof Function
true
Object instanceof Function
true
Function instanceof Object
true

Object:
function Object() { [native code] }
Object.constructor function Function() { [native code] }
Function:
function Function() { [native code] }
Function.constructor == Function true

Object == Function false

能看出两个问题
1.Object 和 Function 互为实例
2.有相同的构造函数 function Function() { [native code] }
3.Object 和 Function 不相等

Number instanceof Number false
Number instanceof Function true
Number instanceof Object true
Number.constructor function Function() { [native code] }

Array instanceof Object true
Array instanceof Function true

4.其他基本类型或者非基本类型也都既是 Object的实例也是Function的实例

我来认真严肃的回答一下这个问题, 这其实是属于原型链的范畴。

以下限于个人理解, 有不对之处欢迎拍砖。
1. 首先ObjectFunction都是构造函数,而所有的构造函数的都是Function的实例对象. 因此ObjectFunction的实例对象
2. Function.prototypeObject的实例对象
3. 实例对象的原型(我们以__proto__来表示)会指向其构造函数的prototype属性, 因此 Object.__proto__ === Function.prototype, Function.__proto__ === Function.prototype, Function.prototype.__proto__ === Object.prototype
4. 当我们访问一个属性值的时候, 它会沿着原型链向上查找, 直到找到或者到Object.prototype.__proto__(为null)截止.

假如我们有以下例子:

var foo = {},
    F = function(){};

Object.prototype.a = ‘value a‘;
Function.prototype.b = ‘value b‘;

console.log(foo.a)    // value a
console.log(foo.b)    // undefined
console.log(F.a)      // value a
console.log(F.b)      // value b

那么

  • foo.a的查找路径: foo自身: 没有 ---> foo.__proto__(Object.prototype): 找到value a
  • foo.b的查找路径: foo自身: 没有 ---> foo.__proto__(Object.prototype): 没有 ---> foo.__proto__.__proto__ (Object.prototype.__proto__): 没有
  • F.a的查找路径: F自身: 没有 ---> F.__proto__(Function.prototype): 没有 ---> F.__proto__.__proto__(Object.prototype): 找到value a
  • F.b的查找路径: F自身: 没有 ---> F.__proto__(Function.prototype): 找到value b

4.关于instanceof的结果不要仅从字面上理解, 它的计算规则是: 如果右侧构造函数的prototype属性能在左侧的对象的原型链中找到, 那么就返回true, 否则就返回false

  • Object intanceof Function: Object.__proto__ === Function.prototype, 因为结果为true
  • Function instanceof Object: Function.__proto__.__proto__ === Object.prototype, 因为结果也为true

至于你说的, ObjectFunction互为实例对象是不对的,ObjectFunction的实例对象, Function.prototypeObject的实例对象。

5.实例对象的constructor属性指向其构造函数, 因此Object.constructor === Function, Function.constructor === Function.

6.最后可以看一下这张图帮助理解:

Object.__proto__
> function Empty() {}
Function.__proto__
> function Empty() {}

他们的隐式原型相同,所以相互 instanceof 都为 true.

=====================================================

有点乱,我讲下我的理解:
Object可以理解为object对象,也可以理解为Object方法,所以,他是Function的实例(Object方法)。
Function可以理解为方法对象,所以是Object对象的实例。

代码中的F先被赋值未一个Function的实例,这个时候继承了Function的方法和Function继承的Object的prototype上的方法。
对Object和Function添加方法后,Object被修改了,所以F上有了Object的新方法a。
修改Function没有影响F是因为,F已经被赋值了老的Function,已经是老Function的实例了,b方法给Function并不会影响到老Function的实例。

时间: 2024-10-01 07:24:32

Object 和 Function的相关文章

理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承

本文参考了http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html这篇文章,对其内容作了个简单总结,形成了几条简单的结论,让读者更容易记住prototype.__proto__.Object.Function之间的关系. 结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端. (typeof Object.prototype) === object;//true Object.prototype.

javascript的 Object 和 Function

一. javascript 的 内置对象: Object 和 Function javascript所有东西,包括 Function 都是对象 . Array  其实是一个 Function 类型的对象, 它的prototype 是指向了 Function.prototype . new Array()  是一个 Object 对象, 它的 prototype 指向了 Object.prototype . 函数的第一种定义方法: function sum1(a,b){              

Javascript Object、Function对象

1.Object对象 原型对象 原型是对象的一个属性,也就是prototype属性,每个对象都有这个内部属性,而且他本身也是一个对象. ? 1 2 3 4 5 6 <script type="text/javascript">      Object.prototype.num= 10;      alert("添加原型对象属性:"+ Object.num);      Object.num = 20;      alert("添加对象属性:&

JS原型的问题Object和Function到底是什么关系

var F = function(){}; Objcert.prototype.a = function(){}; Function.prototype.b = function(){}; F 既能访问到a,也能访问到(Object 和 Function也同样,但是所有的实例只能访问到a):F是Object 和 Function 两个的实例,那么Object 和 Function 到底是什么关系? 下面是对Object 和 Function 的了解 F instanceof Object tru

Js中Prototype、__proto__、Constructor、Object、Function关系介绍

Js中Prototype.__proto__.Constructor.Object.Function关系介绍 一    Prototype.__proto__与Object.Function关系介绍        Function.Object:Js自带的函数对象. prototype,每一个函数对象都有一个显示的prototype属性,它代表了对象的原型(Function.prototype函数对象是个例外,没有prototype属性). __proto__:每个对象都有一个名为__proto

javascript中Object与Function之间的关系

首先看几个例子: Function instanceof Object //true Object instanceof Function // true 说明Object 是被Function 构造出来的 Function instanceof Function //true 说明自己被自己构造 Object.getPrototypeOf(Function) === Function.prototype // true Object.getPrototypeOf(Object.prototyp

Js中Prototype、__proto__、Constructor、Object、Function关系介绍 ,JS原型

此文来自:http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html Js中Prototype.__proto__.Constructor.Object.Function关系介绍 一    Prototype.__proto__与Object.Function关系介绍        Function.Object:Js自带的函数对象. prototype,每一个函数对象都有一个显示的prototype属性,它代表了对象的原型(

JS 究竟是先有鸡还是有蛋,Object与Function究竟谁出现的更早,Function算不算Function的实例等问题杂谈

壹 ? 引 我在JS 疫情宅在家,学习不能停,七千字长文助你彻底弄懂原型与原型链一文中介绍了JavaScript原型与原型链,以及衍生的__proto__.constructor等一系列属性.在解答了多个问题的同时,也得出了很多有趣的结论.比如我们常说JavaScript中函数是一等公民,这是因为函数扮演了创造万物的角色,原始构造函数Function创造了function fn(){}(ES5中函数与构造函数并无区别).Object().Array().Number().String()等诸多构

一步步学习javascript基础篇(3):Object、Function等引用类型

我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂数据类型(即引用数据类型) Object类型 我们用的最多的引用类型就属object类型了,一般用来存储和传输数据是再好不过的.然,它的两种创建方式我们是否了解呢? 1.通过构造函数来创建 如: var obj = new Object(); 在js中的引用类型有个非常灵活的用法,可以动态的附加属性和赋值.