![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
实现继承的方式
蓝色清晨_
不经一番寒彻骨,怎得梅花扑鼻香。
展开
-
举例:组合继承
//组合继承function Big(name){ this.name = name; this.colors = ["red","blue","green"];}Big.prototype.sayName = function(){ console.log(this.name);}function Small(name,age){ //私有属性 age this.age = age; //继承属性 name Big.call(this,原创 2021-03-04 13:44:22 · 98 阅读 · 1 评论 -
原型中的this指向问题
构造函数、实例对象和原型对象之间的关系构造函数可以实例化对象构造函数中有一个 prototype 属性,该属性是一个指针,指向构造函数的原型对象原型对象中有一个 constructor 属性,该属性也是一个指针,指向它的构造函数实例对象中有一个 _ proto _ 属性,指向该构造函数的原型对象原型对象中的方法是可以被实例对象直接访问的。构造函数和实例对象中的 this 指向的是什么?function Person(name,age){ this.name = name; th原创 2020-11-10 15:33:48 · 1246 阅读 · 1 评论 -
原型对象中的方法可以互相访问
弱,之前不知道,今天知道了:Js 原型对象中的方法是可以互相访问、互相调用的,请看实例:function Animal(name,age){ this.name = name; this.age = age;}Animal.prototype.eat = function(){ console.log("动物吃草"); this.play();}Animal.prototype.play = function(){ console.log("玩啥呢");}原创 2020-11-09 16:38:12 · 307 阅读 · 0 评论 -
实例对象使用属性和方法的规则
实例对象使用属性和方法的规则:先在实例中查找,如果有则使用自身的属性和方法如果没有,再去实例对象的 proto 指向的原型对象prototype中查找,找到则使用,如果找不到,则继续通过实例对象的 proto 进行查找,直到未找到报错实例对象使用属性和方法层层的搜索,举例说明:function Person(name,sex){ this.name = name; this.sex = sex; // this.eat = function(){ //原创 2020-11-09 16:36:52 · 172 阅读 · 0 评论 -
实例:组合继承及问题
组合继承(原型链+借用构造函数,又叫伪经典继承)— 最常用的继承方法基本思想:红宝书上这样说,其思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承,这样,即通过在原型上定义方法实现了函数复用,又能保证每个实例都有自己的属性。优点:在原型上定义方法是实现了函数复用,又能够保证每个实例都有它自己的属性。缺点:两次调用超类型构造函数。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。虽然子类型最终会原创 2020-11-09 16:36:20 · 275 阅读 · 0 评论 -
实例:原型链继承及问题
实现原理:让父类的实例作为子类的原型对象存在的问题:如果单独只使用原型链继承会存在以下两个问题:1)包含引用类型值的原型属性会被所有实例所共享:基本数据类型不受影响2)无法在不影响其他实例的情况下向父类传递参数:不能实现子类向父类传参举例说明://父类:构造函数function Parent(name){ this.name = name; this.color = ["green","blue"];}Parent.prototype = { construct原创 2020-11-09 16:35:55 · 796 阅读 · 0 评论 -
实例:借用构造函数继承及问题
实现原理:在子类的构造函数内部,借用call() 或者 apply() 方法,调用超类型的构造函数优点:相比于原型链继承而言,借用构造函数有一个很大的优势,就是子类型函数构造函数可以向超类型构造函数传递参数。缺点:方法都在构造函数内部定义,因此函数的复用性就无从谈起了。基本思想:借用构造函数的基本思想就是利用call 或者 apply 把父类中通过 this 指定的属性和方法复制(借用)到子类创建的实例中。因为this 对象是在运行时基于函数的执行环境绑定的。也就是说,this等于window原创 2020-11-09 16:35:19 · 480 阅读 · 0 评论 -
实例:寄生组合式继承
寄生组合式继承寄生组合式继承的基本思想是什么?有哪些优缺点:寄生组合式继承的基本思想是为了解决组合继承的缺点,组合继承调用了两次父类构造函数,生成了两个实例属性,只不过实例上的覆盖了原型上的属性。用了寄生式继承的方法,将子类原型指向父类原型,一般是Object.create() 与 Object.setPrototype()缺点:感觉还是父类原型中的引用类型值会被所有下面的实例共享,一个改变,其他都变了。所谓寄生组合式继承,即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法,基本思路:不原创 2020-11-09 16:34:46 · 229 阅读 · 0 评论 -
利用原型共享数据
什么样的数据需要写在原型中?需要共享的数据就可以写在原型中原型的作用之一:数据共享//属性需要共享,方法也需要共享//不需要共享的数据写在构造函数中,需要共享的数据写在原型中//构造函数function Student(name,age,sex){ this.name = name; this.age = age; this.sex = sex;}//所有学生的身高都是188,所有人的体重都是55//所有学生都要每天写500行代码//所有学生每天都要吃三顿饭//原原创 2020-11-09 16:34:09 · 229 阅读 · 0 评论 -
函数参数
函数参数有两种:形参和实参。形参:在定义函数时,把函数括号中的变量名称为形式参数,简称形参或虚拟参数。实参:在调用函数时,把函数括号中的参数称为实际参数,简称实参。实参可以为常量、变量和表达式。实参为常量:function sum(num1,num2){//num1,num2为形参 return num1 + num2;}sum(1,2);//1,2为实参;实参为常量(function (a,b) { //a,b为形参 return a + b;})(3,4);//3,4为实参;实参原创 2020-11-09 16:33:36 · 5624 阅读 · 0 评论 -
参数传递
函数参数传递的方式有两种:按值传递和按引用传递;(错误得说法,❌)js的数据类型分为基本类型和引用类型。基本类型与引用类型:基本类型(值类型):String、Number、Boolean、Null、Undefined引用类型:Array、Object、Function、Date等有多个值构成的可变长度的复杂类型基本类型与引用类型有什么区别:基本类型的变量保存的是变量值,引用类型的变量保存的是内存地址;基本类型长度固定,在内存中占据固定大小的空间,数据存放在栈内存中;引用类型可以给对象添加属性原创 2020-11-09 16:33:06 · 156 阅读 · 0 评论 -
_proto_最终指向了哪里
_ proto _ 最终指向了哪里?Object.prototype的__proto__ 是Nullfunction Person(name,age){ this.name = name; this.age = age;}Person.prototype.eat = function(){ console.log("喜欢吃糖");}var per = new Person("小明",5);console.dir(per.__proto__);console.dir(p原创 2020-11-09 16:32:30 · 422 阅读 · 0 评论 -
实例-原型链继承
构造函数是创建对象方式的一种。可以使用 NEW 关键字来实例化对象。其中,在创建构造函数时,首字母应大写,以便区分普通函数。构造函数中的 this 指向实例对象。创建一个构造函数:function Star(uname, age, sex) { this.uname = uname; this.age = age; this.sex = sex}实例化一个对象let zs = new Star('张三', 23, '男')console.log(zs);输出通过构造函数可以转载 2020-11-03 18:27:56 · 192 阅读 · 0 评论 -
继承方式六:寄生组合式继承
前面说过,组合继承是JavaScript最常用的继承方式;不过,它也有自己的不足。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数的内部。没错,子类型最终会包含超类型对象全部的实例属性,但我们不得不在调用子类型构造函数时重写这些属性。再来看一看下面组合继承的例子。function SuperType(name) { ...原创 2020-04-22 17:42:53 · 2725 阅读 · 0 评论 -
继承方式五:寄生式继承
寄生式(parasitic)继承是与原型式继承紧密相关的一种思路,并且同样也是由克罗克夫德推而广之的。寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真地是它做了所有工作一样返回对象。以下代码示范了寄生式继承模式function object(o){ function F() {} F.prototype...原创 2020-04-22 17:42:11 · 2769 阅读 · 0 评论 -
继承方式四:原型式继承
道格拉斯·克罗克福德在一篇文章中介绍了一种实现继承的方法,这种方法并没有使用严格意义上的构造函数。它的想法式借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。为了达到这个目的,他给出了如下函数。function object(o){ function F() {} F.prototype = o; return new F();}在object()...原创 2020-04-22 17:41:31 · 1297 阅读 · 1 评论 -
继承方式三:组合继承
组合继承(combination inheritance),有时候也叫伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而返回二者之长的一种继承模式。其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。下面来看一下例子。function SuperType(nam...原创 2020-04-22 17:40:43 · 2523 阅读 · 1 评论 -
继承方式二:借用构造函数
在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫伪造对象或经典继承)。这种技术的基本思想相当简单,即在子类型的构造函数内部调用超类型的构造函数。别忘了,函数只不过是在特定环境中执行代码的对象,因此可以通过使用apply()和call()方法也可以在(将来)新创建的对象上执行构造函数,如下所示:fun...原创 2020-04-22 17:39:55 · 374 阅读 · 0 评论 -
继承方式一:原型链继承
继承是OO语言中的一个最为人津津乐道的概念。许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法和签名,而实现继承则继承实际的方法。由于函数没有签名,所以在ECMAScript中无法实现接口继承。ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的。 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。简单回顾一下构造函数、原...原创 2020-04-22 17:37:13 · 1186 阅读 · 3 评论