手机版

js原型对象和原型链理解

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

一个例子让你彻底了解原型对象和原型链

入门歌曲(在弹词中(弹词)和一些地方戏曲)

我之前对js中的原型链和原型对象有一定的了解。每当有人问我什么是原型链,什么是原型对象,我总是用一个官方(其实我不懂)的解释来描述。有句话说得好:如果你不能用最简单的语言描述一件复杂的事情,那就意味着你没有真正理解它。最近在读《Javascript高级程序设计》,书中对原型对象和原型链的描述让我受益匪浅。下面只是一个比较的例子来说明。

我们经常这样写

函数Person(){ this . name=' John ';} var Person=new Person();person . prototype . say=function(){ console . log(' Hello,' this . name);};person . say();//你好,约翰上面的代码很简单。Person原型对象定义了一个公共的say方法。虽然这发生在构造实例之后,但由于原型方法在调用之前已经声明,因此每个后续实例都将拥有该方法。从这个简单的例子中,我们可以得出结论:

原型对象的目的是为每个实例对象存储共享的方法和属性,它只是一个普通的对象。并且所有实例共享同一个原型对象,因此只有一个原型对象,这与实例方法或属性不同。所有这些都有以下等式:

person.say==new Person()。说

也许我们会写同样的东西

函数Person(){ this . name=' John ';} var Person=new Person();person . prototype={ say : function(){ console . log(' Hello,' this . name);} };person . say();//person.say不是函数很遗憾,没有找到person.say方法,因此报告了一个错误。其实写这个的初衷是好的:如果想给原型Object增加更多的属性和方法,每次都要写一行Person.prototype,不如直接提炼成一个对象。但是在这个例子中,恰好构造实例对象的操作是在添加原型方法之前,这将导致一个问题:

当var person=new Person()时,Person.prototype为:Person {}(当然里面有构造函数属性),即Person.prototype指向一个空对象{}。对于实例person,里面有一个原型链指针proto,指向Person.prototype指向的对象,也就是{}。接下来,Person的原型对象被重置为指向另一个对象,即

对象{say:函数},

此时,person.proto的点保持不变,它所指向的{}对象中没有say方法,因为报告了一个错误。

从这一现象中,我们可以得出以下结论:

在js中,当一个对象调用一个方法时,它会首先寻找它本身是否存在。如果没有,它将转到原型链,这是实例对象的__proto__属性。

如果想让上面的例子成功运行,最简单有效的方法就是交换构造对象和重置原型对象的顺序,即:

函数Person(){ this . name=' John ';} person . prototype={ say : function(){ console . log(' Hello,' this . name);} };var Person=new Person();person . say();//person.say不是函数一张图片可以让你在几秒钟内理解原型链

事实上,您只需要了解原型对象的结构:

Function.prototype={构造函数: Function,__proto__ :父原型,一些原型属性:};总结:默认情况下,函数的原型对象构造函数指向函数本身。除了原型属性之外,原型对象还有一个原型链指针__proto__,它指向前一层的原型对象,但是前一层的原型对象的结构还是相似的,所以_ _ proto _ _ _总是指向object的原型对象。而对象的原型对象用对象表示原型链的顶部。__proto__=null,转化为javascript原型链的继承。它还解释了为什么所有的javascript对象都有object的基本方法。

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

版权声明:js原型对象和原型链理解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。