js原型和原型链

首先,js中所有东西都是对象,函数也是特殊的对象,所有的东西通过object衍生出来,所以所有东西的终点都指向object.prototype
另外还需要了解一下以下的几个概念:
1. 函数
函数申明:`function foo(){}`
函数表达式:`var foo = function(){}`

2.函数对象
代表函数的对象就是函数对象,函数就是对象
`var foo = new Function(){}
typeof foo  //object`
`function foo(){}
var foo = new foo() ;
typeof foo; //object`

3.本地对象
ecma-262定义的类,包括object,function,array,string,boolean,number,date,regExp,error,evalError,rangeError,ReferenceError,SyntaxError,TypeError,URIError
这些本地对象的typeof都是function,也就是这些类都是通过function建立起来的

4.内置对象
ecmascript实现提供,在程序开始时出现。ecma-262之定义两个内置对象Global和Math

了解完 这些概念之后来看一下原型和原型链
prototype
这个属性是每一个函数都具有的属性,但不是每一个对象都具有的属性。
`function Foo(){}
var foo = new Foo();`
(foo通过Foo.prototype来生成实例)
其中Foo有prototype属性,foo没有,但foo中隐含的_proto_属性指向Foo.prototype
即为foo._proto_ === Foo.prototype

那么prototype属性的作用是什么呢,就是把需要共享的属性放到构造函数也就是父类的实例中去。
_proto_属性则是每一个对象以及函数都隐含的属性。对于每一个具有_proto_的属性的对象,它所指向的是构建他的构造函数的prototype,原型链就是通过这个属性构建的。每一个function的原型就是一个object实例。

看下面的例子
function a(){}
function b(){}
var b1 = new b();
a.prototype = b1;
var a1 = new a()

则 a1._proto_=== a.prototype===b1
另 b1._proto_===b.prototype===object.prototype
即 a1._proto_._proto_._proto_===object.prototype
这样的话,所有的a的实例对象就通过原型链和object的prototype链接起来

有一个例外的是object.prototype._proto_指向的是null




















猜你喜欢

转载自blog.csdn.net/qq_15385627/article/details/80541004