javascript 中 实例,构造函数和原型对象的区别

前天写了一篇关于匿名函数的原型链和集成的文章(点击链接查看),里面蜻蜓点水式的把实例,原型对象和构造函数带过去了.

这种抽象的东西不是很好记忆,我们通过一个示例来说明可能更好了解.

function Person(name){
    this.name=name;
}

在javascript中,你可以把上面的代码看做一个函数,一个类,一个方法,都没有问题.

但是你又能看到其他静态语言的一些身影, 比如: this.name=name; 这是标准的初始化内部属性/变量的语句,第一反应这应该是构造函数.

其实,在javascript中,任何一个函数你都可以把它看做是构造函数,它没有明显的特征.那什么时候它就明显了呢? 实例化的时候.

var xiaoming=new Person('小明');

当这一句代码结束,你就可以肯定的认为 Person 函数是一个构造函数,因为它 new 了"小明"


那么,"小明" 是什么? "小明"是一个人,一个实实在在的人,是被构造函数初始化出来的.所以 var  xiaoming 就变成了一个实例.


当构造函数初始化一个实例对象的时候,构造函数就有了 prototype 属性,它是一个指针,指向了原型对象,(如果构造函数不去初始化 new 实例对象,那么它不会有 prototype 属性)


prototype 属性是可读写的,不是所有对象都有此属性,只有构造函数有此属性. 

不是所有函数都是构造函数, 只有 new 出实例的函数才是构造函数.


实例对象 xiaoming 被构造函数 Person 实例化之后,它就有一个属性 constructor ,此属性是一个指针,指向构造函数 (告诉我们是谁创造了它)

同时,实例对象 xiaoming 初始化以后同时有了一个只读属性 __proto__ ,这个指针指向了原型对象.

xiaoming.__proto__ === Person.prototype  这是一定成立的.


那到底 原型对象是什么? 原型对象就是 xiaoming.__proto__  或者  Person.prototype


所以我们简单总结:

当一个函数可以new 实例对象的时候,这个函数就是构造函数.


被构造函数new 出来的对象是 实例对象. 实例对象的属性 constructor 指向了构造函数.


当一个函数变成构造函数的时候,他的 prototype 指针指向的对象是原型对象 / 实例对象的 __proto__ 指向了原型对象.

回到顶部