首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

原型继承是错误的

。在面向对象编程中,继承是一种重要的概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。然而,原型继承是一种特定的继承方式,它被认为是错误的,因为它存在一些问题和限制。

原型继承是基于JavaScript中的原型链机制。在JavaScript中,每个对象都有一个原型对象,它可以包含属性和方法。当我们访问一个对象的属性或方法时,如果该对象本身没有定义该属性或方法,JavaScript会沿着原型链向上查找,直到找到该属性或方法为止。

原型继承通过将一个对象的原型设置为另一个对象来实现继承。这意味着子对象将继承父对象的所有属性和方法。然而,原型继承存在一些问题。

首先,原型继承是一种全局共享的机制。如果我们修改了父对象的原型,那么所有继承自该原型的子对象都会受到影响。这可能导致意想不到的副作用和错误。

其次,原型继承是一种单向的机制。子对象可以访问父对象的属性和方法,但父对象无法访问子对象的属性和方法。这限制了父对象与子对象之间的交互和通信。

另外,原型继承在创建对象时需要注意一些细节。如果我们不小心修改了原型对象,可能会影响到所有继承自该原型的对象。这可能导致难以调试和维护的代码。

相比之下,更好的继承方式是通过类和对象的组合来实现。这种方式被称为类继承或组合继承。在类继承中,子类通过继承父类的属性和方法来实现继承。这种方式更加灵活和可控,可以避免原型继承的一些问题。

总结起来,原型继承是一种错误的继承方式,它存在一些问题和限制。更好的继承方式是通过类和对象的组合来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

原型原型链和原型继承

原型继承 编程中对象继承,有类继承原型继承: 类继承形式上就是,extends 关键字,继承之后,子类就会拥有父类属性和方法,如下: // 以下 ES6 class 语法,语法上同类继承一样,但实际上仍然原型继承...上一小节继承层面,介绍原型继承,但是没有具体说什么原型。...“类” 和 “类实例” 关系, 就像是工业生产中,模具和具体产品关系,类一个模具,实例就是通过类复刻出来具有类属性和方法具体产品。我们实现继标的目的,就是为了复用一些公共方法或者属性。...有道:万事万物皆对象。那么原型本身也是一个对象,如果查找属性或方法时,到原型还没找到呢,那么就去原型原型继续找。...而javascript 运行环境中预设了一些对象来作为原型,如图: 查找属性或方法时,向上追溯,经过原型,就形成了一条链,所谓原型链。 至于运行环境预设了哪些原型,已经他们关系如何,为什么?

75910

构造函数、原型原型链、继承

每个对象都有一个__proto__属性,该属性一个对象,被称为原型对象,原型对象有一个constructor属性,指向创建对象那个函数(obj.constructor === obj....实际上,由于原型对象B由Object()函数创建,而Object()函数prototype__proto指向null,所以一条原型起点实例对象,终点null,中间由__proto__...继承 有了原型概念就可以开始实现继承了,最基本模式就是修改原型对象: function Father(){ this.say = function(){return this.name} }...: 子类继承了父类所设定属性,但每个实例对象都可以有自己属性值,不会互相影响 子类共享了父类定义方法,因为方法在父类prototype上,所以不会在每个实例对象上创建一遍 如果有哪个属性可以被所有实例对象共享...总之利用原型链实现可靠继承步骤: 在父类函数内设置通用属性 在子类函数内调用父类函数,并设置特有的属性 修改子类函数prototype,以继承父类 修改子类函数prototype.constructor

76620
  • Javascript 组合继承 原型继承 寄生继承

    console.log(this.age); }; var instancel = new SubType("Nicholas", 12); SuperType() 该继承通过构造函数继承原型方法和父类属性...,但该方法会有两次调用父类,第一次继承原型链,第二次在继承属性。...第二种:原型继承 //原型继承实例代码: function createObj(o) {//对传入对象执行了一次浅复制 function F() {} F.prototype..."; yePs.friends.push("Sari"); console.log(person.friends);//"one,two,van,Rob,Sari" 这个没什么,Js原型继承特性...第三种:寄生式继承 在第一种方法上,我们在第一次调用父类,也就是继承原型时候,实际上只需要父类原型副本,那么取得副本,也就省去了这一次调用。 该继承技术最常用

    1.1K40

    this_原型链_继承

    toString哪里来? 画出原型图?并解释什么原型链。...内部逻辑如何实现? instanceof运算符用来测试一个对象在其原型链中是否存在一个构造函数 prototype 属性。即判断是不是一个对象实例,返回 true,不是返回false。...继承就是子类拥有父类属性和方法。 作用:继承划分了类层次性,父类代表更一般、更泛化类,而子类则是更为具体、更为细化;继承实现代码重用、扩展软件功能重要手段。...注意:该参数对象不能 undefined ,另外只有该对象中自身拥有的可枚举属性才有效,也就是说该对象原型链上属性无效。...p 自己属性,所以返回true p.hasOwnProperty("sayName") //false //sayName p 原型 __proto__ 里属性,不是自己属性,所以返回

    57920

    【前端】:对象、原型继承

    原型继承 3.2. 借用构造函数 3.3. 组合继承原型继承+借用构造函数) 3.4. 共享原型 3.5. 临时构造函数 4. 几道笔试题 1....对象里目前存在属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符一个具有值属性,该值可能可写,也可能不是可写。存取描述符由getter-setter函数对描述属性。...它是不可枚举,但是它可写。你可以任意对其赋值。所以 .constructor 一个非常不可靠并且不安全引用。 .constructor 该如何利用?...ES6 .isPrototypeOf 接口还原了 instanceof 操作符本质含义; 示例1: ? 示例2: ? ? ? 3. 模拟类式继承常见方法 3.1. 原型继承 ? ?...组合继承原型继承+借用构造函数) ? ? 3.4. 共享原型 ? ? 3.5. 临时构造函数 ? ? 4. 几道笔试题 题目01: ? 题目02: ?

    1.1K50

    JS原型继承和类式继承

    原型最后指向null。我们说原型继承,就是将父对像方法给子类原型。子类构造函数中不拥有这些方法和属性。...child通过中间层继承了father原型东西。但是为什么中间还有一层object呢,为什么不把child.prototype = father.prototype。...在运行时,无法修改或者添加新方法,这种方式一种固步自封死方法。而原型继承可以通过改变原型链接而对子类进行修改。...另外就是类式继承不支持多重继承,而对于原型继承来说,你只需要写好extend对对象进行扩展即可。 组合模式 另外一种模式,结合类继承原型继承各自优点来进行对父类继承。...而类式继承,与其称它为继承方式,毋宁说是一种函数运用技巧来模拟继承罢了。本文卤煮一己之见,错误偏颇在所难免,如果有之,请各位斧正。

    3.4K90

    原型继承和类式继承

    ,访问实例化子类对象属性或者方法时,依然沿着原型链进行追溯,并且子类实例创建后,class SubPerson中this依然会指向该子类,可以看出,这与es5原型继承一模一样。...Java类式继承 由上面分析可见,es6中类式继承其实还是原型继承。...在运行时,无法修改或者添加新方法,这种方式一种固步自封死方法;相反,原型继承可以通过改变原型链进而对子类进行修改。...类式继承可以实现多重继承(Java通过接口来实现);原型继承一般来说是不支持多继承(因为原型链),但可以通过Mixin变相实现多继承。...基本思路就是:将父类实例以属性方式进行保存,且该属性子类构造函数原型对象属性。 这其实和原型链有关。

    1.5K31

    JavaScript原型继承

    什么原型继承?在JavaScript中,每个对象都有一个原型(prototype),原型本身也是一个对象。...如果原型对象也没有找到,JavaScript会继续在原型对象原型上查找,这样形成了一个原型链。原型继承基于原型继承机制。通过将一个对象原型指向另一个对象,从而实现对属性和方法继承。...我们可以调用myDogsleep和bark方法,因为它们通过原型继承自Animal和Dog原型对象。...当我们在父对象原型上添加属性或方法时,所有继承原型子对象都会具备这些新属性或方法。共享属性和方法:由于子对象共享同一个原型对象,因此它们使用同一个实例。...这意味着它们共享原型对象上属性和方法,可以节省内存空间。缺点:原型继承主要缺点无法传递参数给父对象构造函数。子对象无法直接给父对象构造函数传递参数,因为原型对象已经被实例化。

    39410

    js继承原型

    (在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍是基于原型)。 谈到继承时,js 只有一种结构:对象。...每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它构造函数原型对象(prototype )。...该原型对象也有一个自己原型对象( proto ) ,层层向上直到一个对象原型对象为 null。根据定义,null 没有原型,并作为这个原型链中最后一个环节。...几乎所有 js 中对象都是位于原型链顶端 Object 实例。 尽管这种原型继承通常被认为 JavaScript 弱点之一,但是原型继承模型本身实际上比经典模型更强大。...例如,在原型模型基础上构建经典模型相当简单。

    1.4K10

    JavaScript原型继承

    (在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然基于原型)。 当谈到继承时,JavaScript 只有一种结构:对象。...几乎所有 JavaScript 中对象都是位于原型链顶端 Object 实例。 尽管这种原型继承通常被认为 JavaScript 弱点之一,但是原型继承模型本身实际上比经典模型更强大。...例如,在原型模型基础上构建经典模型相当简单。 ---- 基于原型继承 继承属性 JavaScript 对象是动态属性“包”(指其自己属性)。...当继承函数被调用时,this 指向当前继承对象,而不是继承函数所在原型对象。...结论 在编写使用复杂代码之前,理解原型继承模型至关重要。此外,请注意代码中原型长度,并在必要时将其分解,以避免可能性能问题。

    52510

    JavaScript继承原型

    基于原型继承 继承属性 JavaScript对象是动态,JavaScript对象其实就是动态变量属性容器,也就是键值对容器。...给原型链上一层原型设置了b=3和c=4,由于emp本身具有b属性,因此b值依旧2,然后再上一层原型中找到了c,但是没有d属性,所以d返回undefined。...可以看看emp原型链,体会一下 继承方法 JavaScript并没有其他面向对象语言所定义方法。...看看emp原型链体会一下。当继承函数被调用时,this指向当前对象,而不是原型对象,这点与一般面向对象语言一直。...在JavaScript当中使用原型链 因为JavaScript基于原型,因此函数允许拥有属性,如图。所有的函数都有一个特别的属性——prototype。

    16620

    简单理解通过原型继承

    ("我a内部方法"); }; innerA(); }; var A1=new A();//实例化时候,同时运行对象里面的静态方法 //通过实例给A添加静态方法与静态属性...A1.address="上海"; A1.mothed2=function(){ console.log("我a对象外部静态方法"); } A1.mothed();...A1.mothed2(); //现在B什么属性与方法也没有,通过原型继承a function B(){ this.mothed3=function(){ console.log("我B中方法...,等着被C继承") } }; B.prototype=new A();//把A方法与属性全部给B了,B继承了A; var B1=new B();//实例一个B对象;在实例化对象b对象时候,A...C(); console.log("开始运行C对象了") C1.mothed3(); C1.mothed(); //继承出去了,静态方法与静态属性,还有实例中添加属性与方法 } </script

    54950

    JS中面向对象、原型原型链、继承总结大全

    ,接下来想说js中比较重要继承。...继承 什么原型链 ECMA中继承主要方法就是通过原型链,主要是一个原型对象等于另一个类型实例,由于实例内部含有一个指向构造函数指针,这时候相当于重写了该原型对象,此时该原型对象就包含了一个指向另一个原型指针...,也是本篇最重要内容: 1.属性继承 在子构造函数内,使用apply()或call()方法调用父构造函数,并传递子构造函数this 2.方法继承 使用上文提到原型继承,继承父构造器方法 上代码...方法继承,就是上文讲原型链机制继承,另外可以给子构造函数添加自己属性和方法。 这就是经典继承,避免了但是使用构造函数或者单独使用原型缺陷,成为js中最常用继承方式。...”错误,新原型仅仅在原型修改以后新创建对象上生效。

    1.4K22

    JavaScript继承原型

    继承原型链大家好,这篇文章我将会和大家分享JS关于继承原型有关知识。首先,让我们了解一下什么原型对象。...var object = new Object();//objectObject一个实例对象//object....[[Prototype]]指向Object.prototypenull位于原型顶端,根据定义,null就是没有原型继承属性JavaScript对象是动态属性“包”,它有一个指向它原型链。...函数继承和其他属性继承没有差别,包括上面的属性屏蔽。需要注意,当继承函数被调用时,this指向当前继承对象,而不是继承函数所在原型对象。...使用基于类语言开发人员会对这些结构感到熟悉。但它们不同,JavaScript仍然基于原型

    44740

    JavaScript原型链与继承

    __proto__); // 结果为null 通过上面的示例, 发现开始一句话其实是错误. JS世界中只有一个对象没有原型对象,这个对象就是Object.prototype。...__proto__); Object一个函数,系统内置构造函数,用于创造对象。Object.prototype所有对象原型链终点。...: 遍访hellokitty这个对象原型链上每个原型对象,如果遍访到这个原型对象,某个构造函数prototype,那么就认为hellokitty这个构造函数实例,返回true。...总结一下,A instanceof B, 不能证明Anew B()出来,因为可能继承。 5....组合继承 就是将原型继承和构造函数继承组合在一起;继承两个优点 通过调用父类构造,继承父类属性并保留传参优点, 然后再通过将父类实例作为子类原型,实现函数复用 function People(name

    1.6K50

    Javascript原型继承,说清楚

    一直以来对Javascript原型原型链、继承等东西都只是会用和了解,但没有深入去理解这门语言关于继承这方面的本质和特点。闲暇之余做理解和总结,欢迎各位朋友一起讨论。...从结果可以看出两段代码运行结果一致。...对象是否父类、子类实例判断都是一致 父类、子类都是在对象原型链上 prototype(原型)上属性通过hasOwnProperty判断false 通过构造函数创建属性,可以通过HasOwnProperty...如果多级继承,第一段代码模式原始链始终只有两层,而第二段代码模式原型会有层级关系。...原因:function被实例化时,先创建一个对象,然后复制function构造器prototype属性上所有内容到__proto__(后续原型链),如果复制一个对象,这个对象也有自己原型链(

    52190

    ES5中对象冒充继承原型继承

    ES5里原型继承,既可以实现构造函数继承又可以实现原型继承 function Person() { this.name = 'Augus'; this.age = 20;...'); }; function Web() { }; // 原型链实现继承 Web.prototype = new Person(); // 可以继承构造函数里面的属性和方法 // 也可以继承原型链上面的属性和方法...ES5中,原型继承存在问题,实例化子类没法给父类传值 function Person(name, age) { this.name = name; this.age = age...原型链+构造函数组合继承模式,可以实例化子类向父类传值 function Person(name, age) { this.name = name; this.age = age;...原型链+构造函数组合继承模式另一种写法 function Person(name, age) { this.name = name; this.age = age; this.say

    46820

    【JS精粹】原型继承和构造函数继承 “毛病”

    好了,有这个认知基础,我们再看原型继承原型继承 原型继承最直接一种实现就是:原型继承 ECMA-262 把原型链定义为 ECMAScript 主要继承方式。...__proto__ === null // true 当然,我们并不是来讲原型。重点:点出原型继承“问题”!!...,但是它也有它问题,也是使用构造函数模式自定义类型问题, 即:必须在构造函数中定义方法(在原型上定义方法,子类访问不到),函数不能重用。...构造函数继承:子类不能访问父类原型方法。 咱就是说,这东西怎么这么拧巴呢。。。 于是乎一个规避二者“毛病”继承方式出现了:组合继承~~ 组合继承 目前最流行继承模式组合继承!...思路:使用原型继承原型属性和方法,而通过构造函数继承实例属性。

    1.3K20
    领券