JS 原型与继承2

//***-、原型、原型链、构造函数 prototype、 proto_、constructor

function Foo(){this.a=1} var foo = new Foo();

Object.getPrototypeOf(foo);//访问对象原型 效果等同于,foo. proto ,只是更推荐使用 Es6的 Object.getPrototypeof()方式

// constructor是原型上的一个属性,指向的是构造函数,如果重写了原型,就需要给他定义一个 constructor让它指向构造函数,否则实例的 constructor就会指向object// 重写构造函数原型,需要手动设置 constructor 为当前构造函数 Foo.prototype = {

aa:1,

bb:function(){

console.log(20);

constructor:Foo //很有必要

//***二、继承

//<->、原型链继承 function Super() {

this.a = 11l;

this.b = 1,2,3,4;

Super.prototype.say = function () {

console.log(222);

function Sub({}

Sub.prototype == new Super();//实现:原型链继承

var subl = new sub(); var sub2 = new sub();

//实现的继承结果: subl -- Sub.prototype -- new Super() -- Super.prototype -- Object.prototype

//该方式存在问题(引用值共享问题): subl.b.push(5);

console.log(subl.b);//1,2,3,4,5

console.log(sub2.b) ;// 1,2,3,4,5 sub2的也被修改了

//<二>、构造函数继承 function Super() {

this.a =11l;

this.b = 1,2,3,4;

Super.prototype.say= function (){

console.log(222);}

function Sub(){

Super.call(this);//实现:构造函数继承

var subl = new sub); var sub2 = new sub();

//解决引用值共享问题 subl.b.push(5);

console.log(subl.b);//1,2,3,4,5 console.log(sub2.b) ;// 1,2,3,4

//该方法存在问题(没办法拿到原型上的方法say方法 )

//<三>、组合继承(伪经典继承)

//***伪经典的原因在于,Super()执行了2次 function Super() {

this.a = 111;

this.b = 1,2,3,4;

Super.prototype.say=function(() {

console.log(222);

function Sub(){

Super.call(this);//实现:构造函数继承

Sub.prototype == new Super();//实现:原型链继承

var subl = new Sub(); var sub2 = new sub();

/1 该方式,既能解决引用值共享问题,又能拿到Super.prototype上的其他方法

// 因为,创建实例前,先给Sub指定原型,这时候已经先 newSuper()执行了。此时sub原型上的this.b 就是 1,2,3,4

11 创建实例时,再去 new Sub()时,通过 Super.call(this),就会把前一步构造函数上所有this,b全部覆盖,此时虽然值相同,但是已经是两个不同的引用值了

subl.b.push(5);

console.log(subl.b);//1,2,3,4,5 console.log(sub2.b);//1,2,3,4

//***<四>、寄生组合继承(经典继承) function Super() {

this.a = 11l;

this.b = 1,2,3,4;

Super.prototype.say = function(){

console.log(222);

function Sub(){

Super.call(this);//实现:构造函数继承 ----> 要解决引用值共享功能,所以必须要这样做

//Sub.prototype == new Super();//实现:原型链继承// 要点:通过 object.creat(),绕开new Super()

Sub.prototype =0bject.creat(Super.prototype);//返回一个对象,指定当前赋值对象的原型为传入的参数 //实现:原型链继承

/ 注意:Object.creat(),是Ess的方法,ES3不支持,会有兼容性问题,需要些兼容性方案

***Object.creat 的兼容性方案 if(!Object.creat) {

Object.creat = function(proto) {

function F() {};

F.prototype = proto; return new f();

var subl = new sub(); var sub2 = new sub();

subl.b.push(5);

console.log(subl.b);//1,2,3,4,5 console.log(sub2.b) ;// 1,2,3,4

// 寄生组合继承,依然存在的问题:

/ Sub.prototype-Object.creat(Super.prototype);此时重写了sub的原型,如果在这句执行之前,往sun原型中添加了其他原型方法,就会被覆盖导致不可用而报错

//***<五>、圣杯模式继承:

//***<六>、extends 关键字,直接实现继承(ES6解决方案): class Super() {}

class Sub() extends Super {}

//<七>、拷贝继承

相关推荐
陈随易2 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
Dream-Y.ocean4 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Csvn5 小时前
性能监控
前端
Highcharts.js5 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn5 小时前
构建工具
前端
FRing036 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
kyriewen8 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒8 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫9 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus9 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude