javascript有5种基础的内建对象(Fundamental Objects),Object
、Function
、Error
、Symbol
、Boolean
,而Object
/Function
尤其特殊,是定义其余内建对象或者普通对象和方法的基础。javascript
详细的了解Object
和Function
对象有助于更好的理解javascript的一些工做原理。java
和其余引用类型同样,Object
/Function
既是对象,有本身的方法和属性,也是函数,能够做为构造函数。 本文主要讨论如下几个问题:git
Fucntion.prototype
和普通对象的prototype
有何区别?Object.prototype.__proto__
= ?Object.__proto__
= ?Object
、Function
的原型对象有何特殊之处?在ES6标准中,Function 对象有两个属性:github
length 值为1,这个属性的特性为{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }
,即不可覆盖,不可被for...in
遍历,但能够经过Object.defineProperty
修改它的上面这些特性bash
prototype 为原型对象,(见ES最新标准说明 Function.prototpye)它跟通常函数的prototype
的区别在于app
__proto__
指向它。const o = {number: 20}
Function.prototype = o // 依然是原来的值,未改变
typeof Array.__proto__ // 'function' [=== Function.prototype]
typeof Object.__proto__ // 'function' [=== Function.prototype]
typeof Array.prototype.__proto__ // 'object' [=== Object.prototype]
function F () {}
F.__proto__ === Function.prototype // true
F.prototype = o // prototype指向o
复制代码
prototype
是一个带有constructor
属性的普通对象,但Function
的prototype
是一个函数对象(built-in function object
),是js
中惟一一个默认prototype
为函数的对象typeof Function.prototype // 'function'
function F () {}
typeof F.prototype // ☘ 'object'
typeof Object.prototype // 'object'
复制代码
这是ES标准中规定的Function
对象的两个属性,但其实在FireFox、Chrome在实现时,还有一个name
属性,它的值就是'Function'
。另外还有一个属性,就是__proto__
函数
相比于Object
,Function
对象自带属性是比较少的ui
在ES规范,有关Function.prototype部分 定义的Function
的prototype
的方法有spa
Function.prototype.apply
Function.prototype.bind
Function.prototype.call
Function.prototype.contructor
Function.prototype.toString
Function.prototype[@@hasInstance](V)
复制代码
函数和对象都有__proto__
属性,指向构造函数的prototype
属性所指向的对象,即它的原型对象。prototype
而函数的__proto__
属性(❗️并不是它的原型对象prototype
上的__proto__
属性)指向Function.prototype
,因此Function.prototype
上的属性和方法都会被函数对象(function object)所继承。
经过上面的介绍,相信可以明白如下这些有意思的等式为什么成立
Function.__proto__ === Function.prototype // true ❗️
Object.__proto__ === Function.prototype // true
Object.prototype.__proto__ === null // true
Function.prototype.__proto__ === Object.prototype // true
Object.prototype === Object.__proto__ // false
复制代码
同时,由于函数对象自己有prototype
属性,是Object
的实例,因此也继承了Object.prototype
的属性。
Object
做为函数,与普通函数同样,有length
、prototype
、__proto__
、name
属性,除此以外,还有不少没有被继承的私有方法
// 方法
Object.assign()
Object.create()
Object.defineProperties()
Object.defineProperty()
Object.entries()
Object.freeze()
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.getPrototypeOf()
Object.is()
Object.isExtensible()
Object.isFrozen()
Object.isSealed()
Object.keys()
Object.preventExtensions()
Object.seal
Object.setPrototypeOf()
Object.values()
复制代码
Object
函数对象的方法不是这里的重点,就再也不展开。
与Function.prototype
和其余引用类型(Array.prototype
、String.prototype
)同样是不可写、不可配置、不可for...in遍历的,但依然能够被扩展,便可以往Object.prototype
新增属性和方法
Object.isExtensible(Object.prototype) // true
复制代码
Object.prototype
的一个重要特性是,它是全部对象原型链的终点,由于Object.prototype.__proto__
的值为null
,即Object.prototype.__proto__ === null
复制代码
一个对象的实例,沿着它的原型链,经过__proto__
一层层往上找某一个属性,若是在Object.prototype
上没找到,那就会返回undefined
,因此,原型链不会无限的找下去。
function F () {}
F.prototype.age = 20
let f = new F()
f.__proto__ === F.prototype // true
f.__proto__.__proto__ === Object.prototype //true
f.__proto__.proto__.__proto__ === null // true
/** * 查找过程 * f.color -> 没找到,继续 * f.__proto__.color(F.prototype) -> 没找到,继续 * f.__proto__.__proto__.color(F.prototype.__proto__,Object.prototype) 没找到,返回undefined * 若是继续 f.__proto__.__proto__.__proto__ (Object.prototype.__proto__) === null 结果跟上面同样 */
console.log(f.color) // undefined
复制代码
Object.prototype
上的属性和方法,会被js中的全部方法和对象所继承,ES规范中的属性
Object.prototype.constructor
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toString()
Object.prototype.valueOf()
Object.prototype.__proto__
复制代码
下图是Function
、Object
与Function.prototype
、Object.prototye
相互之间关系图
Object
和Function
之间最让人琢磨不透的,就是他们的关系
Object instanceof Object // true
Object instanceof Function // true
Function instanceof Function // true
Function instanceof Object // true
const o = {}
o instanceof Object //true
o instanceof Function // false
function F () {}
F instanceof Object //true
F instanceof Function //true
复制代码
未完待续 ~~~