- 凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。
实例的构造函数属性(constructor)指向构造函数。(实例没有的属性,js会尝试往原型对象上找,原型对象上没有,再往原型对象的-proto-(Object.prototype)上找,最终会找到Object.prototype._proto_(他就是原型链的终点null),找到就返回对应的值,没找到就返回undefined)- 每个对象都有 __proto__ 属性,但只有函数对象才有 prototype 属性。
原型对象(Person.prototype)是 构造函数(Person)的一个实例。(Person.prototype instanceof Person 为 false)- 原型对象其实就是普通对象(但 Function.prototype 除外,它是函数对象,但它很特殊,他没有prototype属性(前面说道函数对象都有prototype属性))
- 原型对象是用来做什么?主要作用是用于继承。
- this 在函数执行时指向实例。
- null作为一个基本数据类型为什么会被typeof运算符识别为object类型呢? 这是因为javascript中不同对象在底层都表示为二进制,而javascript 中会把二进制前三位都为0的判断为object类型,而null的二进制表示全都是0,自然前三位也是0,所以执行typeof时会返回'object。这是个历史遗留feature(or bug)。
- Object.create()这个方法本来就是用来创建无原型对象的 顾名思义 其实也就是没有__proto__
- Object.prototype.__proto__ === null
-
所有函数对象的_proto_都指向Function.prototype,它是一个空函数(Empty function)
-
Math,JSON是以对象形式存在的,无需new。它们的_proto_是Object.prototype
-
所有对象的 __proto__ 都指向其构造器的 prototype
-
Object.__proto__ === Function.prototype // true
-
Function.__proto__ === Function.prototype // true
-
Function.prototype.__proto__ === Object.prototype
- 原型和原型链是JS实现继承的一种模型。
- 原型链的形成是真正是靠
__proto__
而非prototype