原型:对象的共性描述?回归哲学?
所有对象存在一个到达它原型的链接,原型是寄生在函数上的,当函数被new,则建立对象到原型的链接。对象和构造它的函数没有关系,和构造函数有关系的是原型。
如果函数不被new,则原型无用,或者没有原型,只有当函数被放到new的场景,函数则被挂上了一个原型,这个原型包含一个到这个函数的链接,这个原型也是对象,由Object构造出来,那么这个原型对象的原型就是Object.prototype的值。这个原型应该有两个属性:
1,constructor,指向这个原型所在的构造函数
2,_proto_,指向创建这个对象的构造函数的prototype值,即Object.prototype
所以原型出现在构造对象的场景,参与这个场景的有构造逻辑对象(函数),被构造空白对象(对象原生胚胎),对新生儿对象设置共性的对象(原型),三个角色合理造物。
造物过程是:
1,在某个构造函数F上用new运算符,new F();告诉引擎类F要造物了
2,引擎用Object构造一个对象放到F.prototype上,并把这个对象设置一个属性constructor指向这个F
3,引擎又用Object构造一个对象,把这个对象的_proto_属性指向F.prototype,再把这个对象作为this去调用F,执行F中的构造逻辑。
这个过程,其实Object也在构造对象,所以这个过程在Object造对象时也适用,最终由F构造出来的对象在执行F之前,它的_proto_已经指向Object.prototype了,Object.prototype上的属性和方法可被所有对象访问,执行F之后,F中做的所有事情都是把数据写到了对象之上,而写不到原型上。
重点或者问题:
1,Object.prototype本身也是对象,谁创建了它?
应该是引擎?还是Object?,我觉得是引擎,引擎搞了一个对象,设置一个constructor指向Object,_proto为空,然后再这个对象上放置toString,valueOf等属性。
如果我们不思考JavaScript的继承,那么一切都非常简单,任何一个函数携带的原型对象都是一个空对象,这个空对象由Object函数创建。
写道
详解如下:
new Object()出来的对象A
Object.prototype = [引擎创建的对象] constructor 指向Object, _proto_为空,被引擎设置toString,valueOf等属性。
A对象的_proto_指向Object.prototype
new String出来的对象B
String.prototype = [由Object构造出来的对象] constructor 指向String, _proto_指向Object.prototype。
B对象的_proto_指向String.prototype
任何一个函数F
new F出来的对象X
F.原型是由Object创建出来的对象,这个对象的constructor指向F,_proto指向Object.protype
可以看出顶端是Object.prototype,其他全部平行
要改变这个结构只能在F.prototype这里替换为为其他对象,而不是Object构造出来的对象,这样就可形成一条条长长的原型链条,这就是继承。
2,函数本身也是对象,函数的_proto_指向谁?
按照上面的推理,函数的_proto_应该指向创建函数对象的那个构造函数的原型,晕了吗?
即Function函数的原型,Function函数本身也是对象,它的_proto_呢,这里它指向了自己的prototype。
如下图:
<script type="text/javascript">
alert(Object.prototype.__proto__ == null); //true
alert(typeof Object.prototype.toString);//function
alert(Object.prototype.constructor == Object);//true
alert(Object.__proto__ == Function.prototype);//true
alert(Function.prototype.__proto__ == Object.prototype);//true
alert(Function.__proto__ == Function.prototype);//true
</script>
总结:
在JavaScript中创建对象或者继承,只要瞄准函数携带的那个对象做手脚即可,改变它就可以改变原始的继承结构,但是那个对象虽然纯洁但是它指向了它寄生的函数,所以改变它之后需要修改constructor让它指回来。
函数本身也是对象,它由prototype这个链接到达携带的用于创建对象的原型和_proto_链接到达自己的原型。
- 大小: 407.6 KB
分享到:
相关推荐
JavaScript还提供了面向对象编程的能力,通过构造函数和原型链实现对象的继承。你可以通过实例化对象,定义方法和属性,理解类的概念在JavaScript中的体现。此外,ES6引入了类语法,使得JavaScript的面向对象编程...
《悟透JavaScript》不仅仅是一本介绍JavaScript基础知识和技术细节的书籍,更是引导读者思考编程本质的一种哲学。通过对数据和代码的基本元素进行深入浅出的解析,本书帮助读者建立起对JavaScript乃至整个编程世界的...
JavaScript是一种广泛使用的、基于原型的、多范式的脚本语言,主要用于网页前端开发,但随着Node.js的出现,它也扩展到了服务器端编程。JavaScript的设计灵感来源于Java、Self和Scheme,它支持面向对象、命令式和...
6. **原型与继承**:JavaScript的面向对象特性主要通过原型链来实现,理解原型、构造函数、实例、继承等概念有助于创建复杂的程序结构。 7. **ES6及以上的新特性**:包括箭头函数、模板字符串、解构赋值、Promise、...
js软件界面原型设计 第2章 软件界面原型设计 思考: 软件原型设计的重要性; 如何设计Web应用程序原型 ...界面原型在需求阶段是与用户交流的工具;...Web应用的界面原型需要使用Html、JavaScript设计一个完整的网站
4. **对象的本质**:JavaScript中的对象是基于原型的,每个对象都有一个原型对象,而原型对象本身也可能有原型,形成了一个原型链。这种设计使得对象的继承机制更为灵活。 5. **原型链**:JavaScript通过原型链实现...
这种误解往往源于JavaScript的函数式脚本语言特性,以及它独特的原型链机制。JavaScript中的一切皆为对象,包括函数,这也使得它在实现面向对象编程时有别于基于类的语言。 在面向对象编程中,核心概念包括对象、...
2. **高级特性**:闭包、原型链、作用域、this关键字、函数表达式、箭头函数、模块化(CommonJS、ES6模块)、Promise、异步编程等。 3. **DOM操作**:通过JavaScript与HTML文档对象模型进行交互,包括元素选择、...
标题中的“jquery+纯生javascript写的适合初学者”...对于初学者来说,这份资源可以提供实际的编程经验,帮助他们更好地理解和应用JavaScript和jQuery,同时通过五子棋项目的实现,还能锻炼问题解决和逻辑思考能力。
文档也会探讨闭包、原型链等概念,这些是JavaScript语言的核心特性之一,对于理解JavaScript如何实现封装、继承等面向对象的特性至关重要。 模块化开发是现代前端开发的趋势,文档中的实例将展示如何将代码组织成...
对于那些寻求提升设计水平的读者,书中还分享了顶级设计师在使用JavaScript和jQuery时的设计思考和最佳实践,包括如何利用这两者提升用户体验,创建更具吸引力的交互设计。 总之,《众妙之门——JavaScript与jQuery...
3. **对象与原型链**:熟悉面向对象编程,包括对象创建、属性访问、原型继承、构造函数等概念,深入探讨原型链的工作机制。 4. **数组与字符串**:掌握数组的方法,如push、pop、shift、unshift、slice、splice等,...
总的来说,《悟透JavaScript》这本书不仅是一本介绍JavaScript语言的书籍,更是一种哲学思考的方式。它鼓励开发者从更宏观的角度理解编程,理解数据与代码之间的互动关系,从而更好地利用JavaScript这样的工具解决...
最后,深入研究JavaScript的原型链、作用域、闭包等基础概念,是成为JavaScript高手的必经之路。它们是JavaScript实现继承、封装和模块化的基本手段,也是解决实际问题的关键。 总结来说,"精通JavaScript源码1"的...
《悟透JavaScript》不仅仅是关于JavaScript的技术书籍,更是一种哲学思考的体现。它教会我们如何从复杂中寻求简单,从混沌中寻找秩序。通过深刻理解JavaScript的核心原理,我们可以更好地驾驭这门语言,创造出简洁而...
JavaScript,作为全球最广泛使用的编程语言之一,是创建交互式网页和动态应用的关键工具。对于初学者来说,理解和掌握...记住,JavaScript是一门实践性很强的语言,多写、多读、多思考是成为熟练开发者的关键步骤。
- **原型继承**:JavaScript不使用传统的类来实现继承,而是通过对象的原型链来模拟继承行为。 #### 回归简单:JavaScript的哲学 为了更好地理解JavaScript,我们需要从对象和类的概念中抽离出来,回到数据和代码...