我认识的js原型及原型链

JavaScript原型

在讲js原型之前,必须先了解Object和Function。

Object和Function作为js自带的函数,Object继承自己,Function继承自己,Object和Function互相继承对方,也就是说Object和Function都既是函数也是对象。

1
2
3
4
Function instanceof Object;	//true
Object instanceof Function; //true
Function.prototype //f(){ [native code]}
Object.prototype //Object

普通对象和函数对象

在Javascript的世界里,全都是对象,而对象之间也是存在区别,我们首先区分一下普通对象和函数对象,如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function f1(){};
var f2 = function(){};
var f3 = new function(){};

var o1 = {};
var o2 = new Object();
var o3 = new f1();

console.log(typeof Object); //function
console.log(typeof Function);//function
console.log(typeof f1) //function
console.log(typeof f2) // function
console.log(typeof f3) //function
console.log(typeof o1) //object
console.log(typeof o2) //object
console.log(typeof o3)// object

在上面的代码中可以看出,f1、f2和f3都是函数对象,而o1,o2和o3都是object对象,也就是普通对象,函数对象本质就是由new function()构造而来,其他的都是普通对象;函数对象可以创建普通对象,普通对象没法创建函数对象。

注意:

1、每一个函数对象都有一个prototype属性,但是普通对象是没有的;

  prototype下面又有个construetor,指向这个函数。

2、每个对象都有一个名为__proto__的内部属性,指向它所对应的构造函数的原型对象,原型链基于__proto__;

1
2
3
4
5
6
7
var o = {};
o.prototype; //undefined
o instanceof Object; //true
o._proto_ === Object.prototype; //true
Object === Object.prototype.constructor; //true
Object.prototype.constructor; //function Object(){ [native code]}
Object.prototype.__proto__; //null

原型

在js中,原型也是一个对象,其作用则是实现对象的继承。

在js的所有函数对象中都存在一个属性prototype,该属性对应当前对象的原型。

而所有js对象都存在一个__proto__属性(由于__proto__是一个非标准属性,因此只有火狐和谷歌两个浏览器支持,标准方法是Object.getPrototypeOf()),__proto__属性指向实例对象的构造函数的原型,理解起来就是如下:

1
2
var p = new Person();
p.__proto__ === Person.prototype; //true

从上面代码中,p是实例对象,Person是p的构造函数,可看出p的__proto__属性指向构造函数Person的原型。

请看一下例子加深理解

1
2
3
4
5
6
7
8
9
var parent = function(name){
this.name = name;
}
parent.prototype.getName = function(){
return this.name;
}
var son = new parent("huahua");

console.log(son.getName());//'huahua'

原型链

除开Object的prototype的原型是null以外,所有的对象和原型都有自己的原型,对象的原型指向原型对象。

在层级多的关系中,多个原型层层相连则构成了原型链。

在查找一个对象的属性时,倘若在当前对象找不到该属性,则会沿着原型链一直往上查找,知道找到为止,如果到了原型链顶端,还没找到,则返回undefined。

img

JS中所有的东西都是对象,所有的东西都由Object衍生而来, 即所有东西原型链的终点指向null

构造器constructor

constructor是构造函数创建的实例的属性,该属性的作用是指向创建当前对象的构造函数。

例如,son.constructor == parent;//true

文章目录
  1. 1. JavaScript原型
    1. 1.0.1. 普通对象和函数对象
    2. 1.0.2. 原型
    3. 1.0.3. 原型链
    4. 1.0.4. 构造器constructor
|