原型链
函数、构造函数的区别
任何函数都可以作为构造函数,但是并不能将任意函数叫做构造函数,只有当一个函数通过new关键字调用的时候才可以成为构造函数。如:
var Parent = function(){}
//定义一个函数,那它只是一个普通的函数,下面我们让这个函数变得不普通
var p1 = new Parent();
//这时这个Parent就不是普通的函数了,它现在是一个构造函数。因为通过new关键字调用了它
//创建了一个Parent构造函数的实例 p1
__proto__
、prototype、 constructor
__proto__
、prototype、 constructor 是所有都有的,包括 函数、对象、数字、布尔- prototype 只有函数有,其他的是undefined
__proto__
属性相当于通往prototype唯一指针,因此任何东西都有__proto__
实验
'hello'.__proto__ === String.prototype //
String.__proto__ === Function.prototype //
String.prototype.__proto__ === Object.prototype //
Object.prototype.__proto__ === null // 到头了,没了
对象的__proto__
是父类的prototype
(构造函数) 父类的prototype
(构造函数)的__proto__
是他的父类的prototype
p1.__proto__ === Parent.prototype; //
Parent.prototype.__proto__ === Object.prototype; // x.__proto__ === Object.prototype, 因此万物基于 Object.prototype
Object.prototype.__proto__ === null // , 因此Object.prototype就到头了
constructor属性
String.constructor === Function
'a'.constructor === String