关于prototype以及继承方面的理解

学习笔记(致 渐悟)

写在前面的话

今天看<javascript高级程序设计>的时候,看到有关继承和原型链prototype时遇到些疑问,特回来研究下,同时也感谢JS群网友"渐悟"的指导,非常感谢!

先给Demo,再说话

 1         function Polygon(iSides) {
 2             this.sides = iSides;
 3             this.sex = "男";
 4             this.getName = function () {
 5                 console.log("断桥残雪1");
 6             };
 7         }
 8         Polygon.prototype.getName = function () {
 9             console.log("断桥残雪2");
10         };
11         Polygon.prototype.getArea = function () {
12             return 0;
13         };
14         Polygon.prototype.sex = "man";
15         Polygon.age = 100;
16
17         //三角形
18         function Triangle(iBase, iHeight) {
19             //Polygon.call(this, 3);
20             this.base = iBase;
21             this.height = iHeight;
22             this.getName = function () {
23                 console.log("断桥残雪4");
24             };
25         }
26
27         Triangle.prototype = new Polygon();
28         Triangle.prototype.getArea = function () {
29             return 0.5 * this.base * this.height;
30         };
31         Triangle.prototype.getName = function () {
32             console.log("wawawa");
33         };
34
35
36         var obj = new Triangle(2, 7);
37         //var area = obj.getArea();
38         obj.getName();
39         //console.log(area);
40         console.log(obj.age);
41         console.log(obj.sex);

测试后总结

  • 新增prototype对象方法,只有其成员实例可以访问该方法,两者决然不同(这一句是废话,嘿嘿),例如:

    1 A.prototype.Method=function(){ };
    2 A.Method=function(){ };
  • 原型链prototype可以利用其特殊性,变向的实现继承
  • 类方法/对象方法/原型方法,三者在遇到以下实现时需要注意:

    1 Triangle.prototype = new Polygon();
    2 Triangle.prototype = Polygon.prototype;

    => 第一行是将Polygon成员实例赋给Triangle的prototype,包括Polygon的对象属性、方法和原型属性、方法,不包括类属性、方法。
    => 第二行是将Polygon的prototype直接赋给Triangle的prototype,仅包括Polygon中prototype对象的属性和方法。

  • 准确的来说,prototype不能完全实现继承,因为使用protype时是无法传递参数的。若要实现继承,更恰当的方式是用对象冒充的方式继承父类的属性(当然prototype也可以继承父类的属性,有局限),然后用原型链继承父类的方法。
  • 当父类存在成员方法A,然后父类的原型链中也存在方法A,子类继承了父类,且子类也重写了成员方法A和prototype对象方法A,则他们的调用顺序优先级为:子类A() > 子类prototype对象方法A() > 父类成员方法A() > 父类prototype对象方法A()

结语

好了,今天后来有事儿去了,耽搁了,差点忘记了,要不然明天捂脸见你,说句实话我回来学习了下,也就知道这些了,希望你看到有错误不足啥的可以提出,谢谢!

今天身为程序员的班子,十一抢火车票,又用客户端App又用浏览器插件的,还是木有抢到票,啊啊啊......

时间: 2024-08-09 10:36:41

关于prototype以及继承方面的理解的相关文章

有关C++虚拟继承的简单理解

最近在看<深度探索C++对象模型>这本书的时候,里面第一章提到了虚拟继承,有这么一句话说:"在虚拟继承的情况下,base class不管在继承串链中被派生多少次,永远只会存在一个实体."一开始我理解错了,以为这个继承类图体系里面全局只有一个base class对象,后来查了些资料才知道意思是一个子类中只包含一个bass class对象. 很多东西要有对比才能认识得更深刻,我们这里对比下虚拟继承和普通继承的子类对象的区别,也从而让我们更好地理解文章开头提到的书里的那句话. 虚

JavaScript面向对象(3)--prototype和继承

1.使用prototype实现继承 1 function BaseClass() 2 { 3 var privateName = "private"; 4 5 this.pubicName1 = "public1"; 6 7 var privateMethod = function() 8 { 9 alert("privateMethod"); 10 } 11 12 this.publicMethod1 = function() 13 { 14

理解原型Prototype、继承

原型一直都是js中比较难理解的一块,那么原型究竟是什么,原型链又是什么? 原型Prototype是指当我们只要创建一个新的函数,就会根据特定的规则为这个函数创建一个prototype属性,这个属性指向函数的原型对象,原型对象通过其自身的constructor属性中的指针又指向拥有prototype属性的函数,也可以说是构造函数. 原型链是指如果让一个函数a的原型对象等于另一个类型b的实例,那么此时的a的原型对象就包含一个指向b的原型对象的指针,相应的,b的原型中包含指向构造函数b的指针,如果b的

对Javascript的原型,原型链和继承的个人理解

继承是OO语言中一个最为人津津乐道的概念,也是初接触Javascript的初学者难理解的概念=.=继承主要分为两种:一种是接口继承,另一种是实现继承.而在ECMAScript中只支持实现继承,所以我们今天来讨论讨论实现继承.实现继承就是继承实际的方法,主要依靠原型链来实现.讲到这里我们就需要讨论讨论什么是原型链. 1.什么是原型 要理解原型链我们首先要知道什么是原型.我们知道每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象包含所有实例共享的属性和方法.所以我个人

prototype和constructor之初理解

因为整理以前的笔记,发现了这两个东西,也算是我对他们最初的最幼稚的理解吧. 乍一回忆,prototype是为一个大的类增加行为用的,而这个行为实例们普遍都要用到:而constructor顾名思义是构造,构造函数? 先说说prototype,因为理解的很浅,感觉没啥好说的,直接上个例子: 1 function Person() { 2 this.age = 20; 3 this.name = 'hello world'; 4 } 5 6 Person.prototype.show = functi

js中的prototype和基于prototype的继承总结

与其他编译语言的继承相比,javascript也有一套继承实现方式,即使用prototype原型及其链的方式. 1.我们先用一个简单的例子先理解原型链, function superClass(){ this.value = "super"; } superClass.prototype.getSuperValue = function(){ return this.value; } function subClass(){ this.subClassValue = "sub

【JavaScript】类继承(对象冒充)和原型继承__深入理解原型和原型链

JavaScript里的继承方式在很多书上分了很多类型和实现方式,大体上就是两种:类继承(对象冒充)和原型继承. 类继承(对象冒充):在函数内部定义自身的属性的方法,子类继承时,用call或apply实现对象冒充,把类型定义的东西都复制过来,这样的继承子类与父类并没有多少关联,不互相影响,有利于保护自身的一些私有属性. 原型继承:每个函数都有自己的原型(prototype)属性,这个属性是在生成实例对象时自动创建的.它本身又是一个对象,拥有能够在实例间共享的属性和方法.而实例本身的属性和方法,则

关于prototype以及__proto__的一些理解

prototype属性只有函数对象才拥有,可以称之为显性属性; __proto__每个对象都拥有包括函数对象,而这个称之为隐性属性. function Lxy (){};  //一个构造函数 var b = new Lxy();// 这个时候 new做了几个步骤. //1.  var b = {}   是个空对象(注意是个空对象!!),这也是为什么new出来的实例没有prototype属性(废话不是函数 当然没有prototype了); //2.  b.__proto__ = Lxy.proto

JS继承(简单理解版)

童鞋们,我们今天聊聊js的继承,关于继承,平时开发基本用不到,但是面试没有不考的,我就想问,这是人干的事吗? 好吧,迫于社会主义核心价值观,我们今天就来简单说一说js的继承,谁让它是面向对象编程很重要的一个方面呢 首先一句定义,什么是继承: A对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法. 常见的集成方式有六种,我们今天依次简单的说一下,现在让我们把这六种方式分一下类,大致上可分为三类 第一类:普通类 这类继承方法有个特性,就是简单,容易实现,一共两种: 1.原型链继承 关键点