1,创建对象的方式主要有以下几种:
2,原型,构造函数,实例,原型链
下面是创建对象的几种方式:
创建对象的方式 第一种 字面量对象,一个是new Object , Object 可以把当做一个构造函数 可以使用new
创建对象的方式 第二种 使用显示的构造函数来创建
创建对象的方式 第三种 ES5的创建方式 create 的讲解:developer.mozilla.org/zh-CN/docs/…
var P = {name:'o4'}
var o4 = Object.create(P)
这是一个原型链的图
如上图所展示的,原型对象指向构造函数的指针是 constructor ,构造函数的 prototype 指向原型对象,构造函数通过 new 操作符来创建一个实例 , 实例又可以通过内部指针 proto 指向原型对象。
proto 连接的这一条原型对象就构成了原型链。
如上面列举的创建对象方式的第二种方式,M 就是一个构造函数,那么 M 就应该有一个 原型对象,可以通过 prototype 找到!而 M 的原型对象存在 constructor,按照上图所示, M 的 原型对象的 constructor 指向的就是 M 本身;实践看结果
上图就可以明了的证明构造函数和原型对象之间的关系;
那么我们再来看实例和原型对象的关系。依照上面的关系图,实例的内部指针proto指向原型对象,构造函数 M 的原型也指向同一个原型对象,究竟指向的是不是同一个原型对象呢?我们再来看:
这样两个例子就很明白的说明了实例、构造函数、原型对象三者之间的关系。
那么明白了三者之间的关系我们就来说一下原型链,从一个实例对象向上找有一个构造实例的原型对象,这个原型对象又有构造它的上一级原型对象,如此一级一级的关系链,就构成了原型链。原型链的最顶端就是Object.prototype
原型链最重要的作用就是继承,实例来继承上一级的属性或方法。此外,如果有多个实例,而多个实例存在共同方法,或共同属性,我们不想每一个实例都创建一份这些属性或方法,就可以将这些属性存在原型对象上,实例一样可以使用这些属性或方法;
类似于作用域链,实例在调用方法时,如果在本身没有找到,就会在原型对象上查找,如果也没有找到,就会再向上一级原型对象查找,一直找到Object.prototype ;如果中间找到会停止查找返回该方法。如果一直没找到会返回未定义;
通过原型链的方式找到原型对象,原型对象上的方法是被不同的”实例“所共有的,这个就是原型链的工作原理
function Foo1(){
this.name1 = '1';
}
function Foo2(){
this.name2 = '2';
}
Foo2.prototype = new Foo1();
function Foo3(){
this.name = '3';
}
Foo3.prototype = new Foo2();
var foo3 = new Foo3();
console.dir(foo3);这个就是一个完整的原型链的场景