七台河市网站建设,网站开发需求分析编写目的,参考消息电子版官网,大鹏新网站建设两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客#xff1a; 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用#xff0c;其中一篇还有我学习时的错误理解。今天看《Understanding Scopes》这让我从新思考了一下原型继承…两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用其中一篇还有我学习时的错误理解。今天看《Understanding Scopes》这让我从新思考了一下原型继承更重要的是站在一个继承设计者的角度再看一下原型继承。 在传统的面向类的继承体系中我们有个Best Practices是优先使用(对象)组合代替(类)继承而原型继承是这个思想的一个运用。和面向对象和函数式编程一样使用几乎任何语言都可以实现这样的思想我以前学的只是这个思想的一个JavaScript实现而已。 基于原型的继承其实是一种组合式的继承朴素的说法就是子域中属性找不到的话就去父域中找找这里的父域是用原型(__proto__)去引用的依次递归整个原型链。最终的实现其实就是对象的组合。子对象包含父对象的引用。既然是继承必然涉及到重名问题子对象和父对象各自相当于一个作用域重名问题的处理也是就近(可覆盖shadow/隐藏hide)原则即子作用域的同名属性会起作用隐藏了父作用域的同名属性但是由于是组合这两个属性是独立的。我们用伪代码看看 aParent {name:’jerry’} aChild {__proto__:aParent, name:’frank’} aChild中的name和aParent中的name是各自独立的。我们aChild.name’unknown’并不会改变aParent.name。 有一点要拿出单独说说造成迷糊的最大根源就是误解对于如下代码 aParent {name:’jerry’} aChild {__proto__:aParent} 若我们取aChild.name的值我们很容易resolve那就是子域中找不到去父域中找找到了jerry。但是对于aChild.name ‘frank’这样的赋值代码我们会产生歧义(ambiguous)我们可能有两中含义 1更新父域中的name属性为frank。 2设置子域中的name属性为frank。 JavaScript选用的方式是第2种。即设置(新建)子域自己的name属性为frank并隐藏了父域中的name属性。我们通常误以为JavaScript是按1的方式工作其实不是。 另外类(模版)其实在编程语言的实现中是可有可无的像JavaScript压根就没有类(模版)他只有对象new Point()只不过是一个语法糖跟aObj createObject()是一样的只是调用一个方法去生成一个对象而已。转载于:https://www.cnblogs.com/Jerry-Chou/p/understanding-prototype-inheritance-2.html