JS的原型和原型链

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guanguan0_0/article/details/87813197

函数(function)

function foo() {}   // 函数声明
var foo = function() {}  // 函数表达式

函数对象(function object):代表函数的对象

var foo = new function() {}

function Foo() {}
var foo = new Foo();

本地对象(native object)

     独立于宿主环境的ES实现提供的对象,是ES定义的类(引用类型),包括:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError.

内置对象(build-in object)

     ES实现提供的独立于宿主环境的所有对象,在ES程序开始执行时出现,已经被实例化了。Global和Math(每个内置对象都是本地对象)

宿主对象(host object)

     由ES实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象

prototype

     是每个函数都具有的属性,但不是每一个对象都有的属性

function Foo(){}

var foo = new Foo();

以上,Foo中有prototype属性,而foo没有。但是foo中的隐含_proto_属性指向Foo.prototype

JS 中所有的数据类型都是对象,为了实现面向对象,利用“继承”将所有的对象连接起来,通过new的方式来实现实例

_proto_

_proto_属性是每一个对象以及函数都隐含的一个属性,都是指向到创建它的构造函数的prototype。原型链就是通过这个属性构建的。

function a() {}
function b() {}

var b1 = new b();
a.prototype = b1;
var a1 = new a();

a1._proto_ === b1; // true
a1._proto_._proto_ === b.prototype;  //true
a1._proto_._proto_._proto_ === Object.prototype;  //true

原型和原型链的关系

1、JS所有东西都是对象,函数是一种特殊的对象

2、JS中所有的东西都是有Object衍生出来的,即所有东西原型链的重点指向Object.prototype

3、JS对象都有一个隐藏的_proto_属性,他指向创建它的构造函数的原型,但,Object.prototype._proto_指向的是null

4、JS中构造函数和实例之间的关系:

// 构造函数通过定义prototype来约定其实例的规格,再通过new来构造实例,作用是产生对象
var foo = new Foo();

// 构造函数本身是方法的实例,所以可以查到他的_proto_(原型链)
function Foo(){}  等价于   var Foo = new Function();

typeof(Object);  // function  Object也是通过Function创建出来的。
// Object的_proto_指向的是Function.prototype

Function.prototype._proto_ === Object.prototype; // true  (所有东西都是对象)

猜你喜欢

转载自blog.csdn.net/guanguan0_0/article/details/87813197